【问题标题】:WEB API OdataController POST call returns 406 Not AcceptableWEB API OdataController POST 调用返回 406 Not Acceptable
【发布时间】:2019-12-15 18:07:59
【问题描述】:

当我向 ODataController 发送 POST 请求时,记录被插入到表中,但我收到以下错误“远程服务器返回错误:(406) 不可接受。”对同一控制器的 GET 调用工作得很好。

我尝试访问的 URL 是 http://localhost:24419/User 和用于 POST 的 JSON 正文。 我发布了以下 JSON(重命名属性):

{  
   "User_ID":0,
   "User_Name":"email@domain.com",
   "First_Name":null,
   "Middle_Name":null,
   "Last_Name":null,
   "Telephone_Number":null,
   "Alternate_Email":null,
   "Record_Update_UTC_Datetime":"2019-08-06T19:42:59.5380526Z",
   "Record_Update_Application_User_Name":"username",
}

适用于以下型号

public class User
    {
        [Key]
        public int User_ID { get; set; }
        [Required]
        [StringLength(255)]
        public string User_Name { get; set; }
        [StringLength(32)]
        public string First_Name { get; set; }
        [StringLength(32)]
        public string Middle_Name { get; set; }
        [StringLength(64)]
        public string Last_Name { get; set; }
        [StringLength(64)]
        public string Telephone_Number { get; set; }
        [StringLength(255)]
        public string Alternate_Email { get; set; }
        [Required]
        public DateTime Record_Update_UTC_Datetime { get; set; }
        [Required]
        [StringLength(128)]
        public string Record_Update_Application_User_Name { get; set; }
    }

下面是控制器:

public class UserController : ODataController
{
        [HttpGet]
        [EnableQuery(MaxExpansionDepth = 10, PageSize = 50, MaxNodeCount = 50)]
        public async Task<IHttpActionResult> GetUser()
        {
            var results = await _userService.GetUsers();
            return results.MakeWebApiActionResult(this);
        }

        public async Task<IHttpActionResult> Post([FromBody] User user)
        {
            var results = await _userService.AddUser(user);
            return Ok(results);
        }
}

我希望得到 200 OK 响应,但实际输出是:

"ExceptionMessage": "远程服务器返回错误:(406) Not Acceptable。"

【问题讨论】:

  • 检查 reequest-header 的定义以及是否可以接受
  • 您可以添加您要发布的 JSON 内容吗?
  • @JohnB 更新了我的问题
  • @JohnB 请求标头看起来不错。 {内容类型:应用程序/json; charset=utf-8 主机:localhost:24419 内容长度:1123 预期:100-继续连接:保持活动状态}
  • 也许它只接受text(不接受json

标签: c# asp.net-web-api odata asp.net-web-api-routing asp.net-web-api-odata


【解决方案1】:

根据asp.net-web-api docs 你需要使用[HttpPost]attribute。试试这个:

public class UserController : ODataController
{
/*...*/
    [HttpPost]
    public async Task<IHttpActionResult> Post([FromBody] User user)
    {
        var results = await _userService.AddUser(user);
        return Ok(results);
    }
/*...*/

【讨论】:

    【解决方案2】:

    406 特定于 WebApi 控制器(准确地说,是 REST 调用的响应标头,指示以所需方式格式化输出数据时出现问题),不一定要对 WebApi 控制器中的 OData 调用执行任何操作。

    请用 [Produces("application/json")] 装饰你的班级 在您从 API 客户端调用的请求中,连同请求正文,还请在请求中添加一个值为“application/json”的“Accept”标头。

    这应该可以解决您的问题。另外,我希望你不要在你的 startup.cs 文件中玩弄 mvc 配置服务 wrt 的 MVCServices 格式化程序。

    【讨论】:

    • ProducesAttribute 是 MVC,OP 已将其标记为 OData,@lobi 添加 HttpPostAttribute 的响应对于此常见问题是正确的。
    • 知道了。我想 HttpPost 应该足够了,因为 application/json 是可用的默认格式化程序
    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2019-12-16
    • 2018-07-15
    相关资源
    最近更新 更多