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