WebAPI为HttpGet抛出415错误

本文关键字:错误 抛出 HttpGet WebAPI | 更新日期: 2023-09-27 17:59:52

我现在被欺骗了。

我的Web API 2控制器中有一个[HttpGet]方法:

[HttpGet]
public LanguageResponse GetLanguages(LanguageRequest request) 
{
...
}

我的url如下http://localhost:1234/api/MyController/GetLanguages?Id=1

当尝试调用它时(例如,通过Postman),我收到HTTP错误415:

{"message":"The request contains an entity body but no Content-Type header. The inferred media type 'application/octet-stream' is not supported for this resource.","exceptionMessage":"No MediaTypeFormatter is available to read an object of type 'LanguagesRequest' from content with media type 'application/octet-stream'.","exceptionType":"System.Net.Http.UnsupportedMediaTypeException","stackTrace":"   at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)'r'n   at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)"}

这有点奇怪,因为我使用的是GET

如果添加Content-Type:application/json,则不会引发异常,但方法的request参数会设置为null

在我的客户端代码中,情况更糟。我无法设置Content-Type标头,因为我的HttpRequestMessage中没有Content,如果我设置内容,它会抱怨我使用了错误的动词。

WebAPI为HttpGet抛出415错误

为什么我们必须在ASP中指定FromBody和FromUri中解释的As。NET网络-API?,对于要从Uri解析的复杂模型,您必须在要从请求Uri:解析的参数上使用[FromUri]属性

[HttpGet]
public LanguageResponse GetLanguages([FromUri] LanguageRequest request) 
{
    ...
}

否则,模型绑定器将抱怨缺少Content-Type标头,因为它需要知道如何解析请求正文,而GET请求中缺少或为空。

要在具有正文(POST、PUT…)的请求上为客户端设置内容类型,请参阅如何为HttpClient请求设置内容类型标头?。