0

我想佔用我的OData行動,並試圖張貼JSON數據爲:無法張貼JSON數據的OData的WebAPI服務行動

{ 
    "contractId":[1,3,5,7,9], 
    "projectId":9 
} 

我的動作配置爲:

var deleteContracts = builder.EntityType<Contract>().Collection.Action("DeleteItems").Returns<HttpResponseMessage>(); 
deleteContracts.CollectionParameter<long>("C_Id"); 
deleteContracts.Parameter<long>("P_Id"); 

行動是如下:

[HttpPost] 
public IHttpActionResult DeleteItems (ODataActionParameters param) 
{ 
    //DO something 
    return null; 
} 

當我試圖把這個,我得到了以下問題:

「錯誤」:{
「代碼」:「」,
「消息」:「請求實體的媒體類型‘應用程序/ x WWW的形式進行了urlencoded’不支持該資源」。 ,
「innererror」:{
「消息」:「沒有MediaTypeFormatter可讀取來自與媒體類型內容類型‘ODataActionParameters’的對象‘應用程序/ x WWW的形式進行了urlencoded’」,
「鍵入 「: 」System.Net.Http.UnsupportedMediaTypeException「, 」堆棧跟蹤「:」 在System.Net.Http.HttpContentExtensions.ReadAsAsync [T](HttpContent內容,類型類型,IEnumerable`1 FO rmatters,IFormatterLogger formatterLogger,的CancellationToken的CancellationToken)在System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage請求,類型類型,IEnumerable`1格式化,IFormatterLogger formatterLogger,的CancellationToken的CancellationToken)」
}
}

響應頭:

Content-Type: application/json; odata.metadata=minimal 

服務器:IIS/10.0 ODATA-版本:4.0 X-Sourcefiles:???= UTF-8乙QzpcVXNlcnNcbG1pc2hyYVxEb2N1bW VudHNcTGF4bWlrYW50XF9wcm9qZWN0c1xXZWJcRGV2ZWxvcG1lbnRcQ29udHJhY3RzXEluRWlnaHQuQ29udHJhY3RzLldlYlNlcnZpY2VzXG9kYXRhLWNvbnRyYWN0c1xDb250cmFjdHNcRGVmYXVsdC5EZWxldGVTZWxlY3RlZENvbnRyYWN0 = X供電,通過:ASP.NET 日期:星期五,2016年11月25日4點45分35秒GMT 的Content-Length:786

請求頭:

POST /ContractsWebServices/ContractsWebService/odata-contracts/Contracts/Default.DeleteItems HTTP/1.1 

主持人:本地主機:65314 content-type:application/json content-length:50

{ 「contractId」:[1,3,5,7,9], 「projectId」:9 }

任何幫助表示讚賞。 謝謝。

回答

0

的NuGet不能妥善解決的OData的DLL版本。在Odata版本中用於路由的版本是v2/3,但是按照第4版爲新添加的控制器完成了實現。

0

什麼是你的HTTP請求頭?

您應該添加在頭後面,表示請求的格式。

Content-Type: application/json 

編輯:

有兩點需要注意:

  1. 不要使用HttpResponseMessage作爲響應類型,或元數據會不會看上去很怪。只需使用你想返回實際的實體或原始類型,可以留空,如果沒有返回
  2. 參數名稱不匹配: contractId-> C_ID,projectId->的p_id

但基礎上,消息,問題仍然在發送錯誤的頭部。

請嘗試以下代碼:

namespace wea1 
{ 
    using System.Web.Http; 
    using System.Web.OData; 
    using System.Web.OData.Builder; 
    using System.Web.OData.Extensions; 

    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      var builder = new ODataConventionModelBuilder(); 
      var deleteContracts = builder.EntityType<Contract>().Collection.Action("DeleteItems").Returns<int>(); 
      deleteContracts.CollectionParameter<long>("contractId"); 
      deleteContracts.Parameter<long>("projectId"); 

      builder.EntitySet<Contract>("Contracts"); 
      config.MapODataServiceRoute("r1", "r1", builder.GetEdmModel()); 
     } 
    } 

    public class Contract { public int Id { get; set; } } 

    public class ContractsController : ODataController 
    { 
     [HttpPost] 
     public IHttpActionResult DeleteItems([FromBody]ODataActionParameters param) 
     { 
      return Ok(2); 
     } 
    } 
} 

請求:

POST http://localhost:57071/r1/Contracts/Default.DeleteItems HTTP/1.1 
Content-Type: application/json 
Host: localhost:57071 
Content-Length: 50 

{ 
    "contractId":[1,3,5,7,9], 
    "projectId":9 
} 

響應:

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; odata.metadata=minimal 
Expires: -1 
Server: Microsoft-IIS/10.0 
OData-Version: 4.0 
Content-Length: 82 

{ 
    "@odata.context":"http://localhost:57071/r1/$metadata#Edm.Int32","value":2 
} 
+0

我已經使用內容類型爲application/JSON和有認證頭了。 – Laxmikant

+0

@Laxmikant除了它是說,你的內容類型是application/X WWW的形式,進行了urlencoded – Dijkgraaf

+0

我不同意,所以我已經使用內容類型爲application/JSON。即使我試圖在另一個控制器,它正在 – Laxmikant