WEB API OdataController POST 调用返回 406 Not Acceptable

Posted

技术标签:

【中文标题】WEB API OdataController POST 调用返回 406 Not Acceptable【英文标题】:WEB API OdataController POST call returns 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 【参考方案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 是可用的默认格式化程序

以上是关于WEB API OdataController POST 调用返回 406 Not Acceptable的主要内容,如果未能解决你的问题,请参考以下文章

如何为自托管的Web API添加身份验证?

ASP.NET Odata Web API 的错误处理

在没有实体框架的情况下创建 Odata Web API 应用程序

抽象的通用 ODataController 类导致“未找到 HTTP 资源”

公开 DTO 时的 ApiController 与 ODataController

Web API接口 安全验证