【问题标题】:Unable to Post JSON data to OData WEBAPI Service Action无法将 JSON 数据发布到 OData WEBAPI 服务操作
【发布时间】:2017-05-07 15:29:28
【问题描述】:

我正在尝试使用我的 OData 操作并尝试将 JSON 数据发布为:

{
  "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;
 }

当我尝试调用它时,我遇到了以下问题:

“错误”:{
"代码": "",
"message": "该资源不支持请求实体的媒体类型 'application/x-www-form-urlencoded'。",
“内部错误”:{
"message": "没有 MediaTypeFormatter 可用于从媒体类型为 'application/x-www-form-urlencoded' 的内容中读取类型为 'ODataActionParameters' 的对象。",
"type": "System.Net.Http.UnsupportedMediaTypeException", "stacktrace": "在 System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancelToken)"
}
}

响应头:

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

服务器:Microsoft-IIS/10.0 Odata-版本:4.0 X-Sourcefiles: =?UTF-8?B?QzpcVXNlcnNcbG1pc2hyYVxEb2N1bWVudHNcTGF4bWlrYW50XF9wcm9qZWN0c1xXZWJcRGV2ZWxvcG1lbnRcQ29udHJhY3RzXEluRWlnaHQuQ29udHJhY3RzLldlYlNlcnZpY2VzXG9kYXRhLWNvbnRyYWN0c1xDb250cmFjdHNcRGVmYXVsdC5EZWxldGVTZWxlY3RlZENvbnRyYWN0?= X-Powered-By: ASP.NET 日期:格林威治标准时间 2016 年 11 月 25 日星期五 04:45:35 内容长度:786

请求头:

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

主机:本地主机:65314 内容类型:应用程序/json 内容长度:50

{ "contractId":[1,3,5,7,9], “项目ID”:9 }

感谢任何帮助。 谢谢。

【问题讨论】:

    标签: angularjs web-services asp.net-web-api asp.net-web-api2 odata


    【解决方案1】:

    您的 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
    }
    

    【讨论】:

    • 我已经使用 Content Type 作为 application/json 并且还有身份验证标头。
    • @Laxmikant 除了说你的内容类型是 application/x-www-form-urlencoded
    • 我同意,所以我已经将 Content Type 用作 application/json。即使我在另一个控制器中尝试了另一个端点,它也在工作
    • 你能把整个请求和响应头放在问题中吗?可以忽略与身份验证相关的条目。
    • 添加到问题中
    【解决方案2】:

    Nuget 无法正确解析 oData dll 版本。在项目中用于路由的 Odata 版本是 v2/3,但根据 v4 对新添加的控制器进行了实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 2019-01-30
      • 2017-11-19
      • 2014-07-23
      • 1970-01-01
      相关资源
      最近更新 更多