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的主要内容,如果未能解决你的问题,请参考以下文章
在没有实体框架的情况下创建 Odata Web API 应用程序
抽象的通用 ODataController 类导致“未找到 HTTP 资源”