为啥在路由到 REST WebAPI 获取方法时需要内容类型标头?

Posted

技术标签:

【中文标题】为啥在路由到 REST WebAPI 获取方法时需要内容类型标头?【英文标题】:Why is content-type header needed when routing to an REST WebAPI get method?为什么在路由到 REST WebAPI 获取方法时需要内容类型标头? 【发布时间】:2020-07-16 12:41:47 【问题描述】:

作为下面显示的示例代码,我试图通过调用 http://localhost:51292/API/MyWebAPI/GetData/?Name=John 来访问 get 方法,然后我收到一条错误消息 "请求包含实体主体但没有 Content-Type 标头。此资源不支持推断的媒体类型“application/octet-stream”。"

public class MyData

    int ID  get; set; 

public class MyDataDTO : MyData

    string Name  get; set; 


public class MyWebAPIController : ApiController

    [AllowAnonymous]
    [HttpGet]
    public IHttpActionResult GetData(MyDataDTO publicInfo)
    
        
        return Ok(publicInfo);
    

我没有找到任何适当的理由说明为什么它需要内容类型,也许它与 API 控制器或路由有关?我的路由如下图:

    HttpConfiguration config = new HttpConfiguration();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "API/controller/action"
    );
    app.UseWebApi(config);

【问题讨论】:

I am trying to access the get method by visiting http://localhost:51292/API/MyWebAPI/GetData/?Name=John 在您的网络浏览器中?在邮递员?还有什么? 在我的网络浏览器中。 也许您错过了添加输入格式化程序? Similar topic 请显示来自您的网络浏览器开发工具的请求和响应标头。 从表面上看错误,asp.net希望您设置一个内容类型标头,以便它可以理解请求正文-并非不合理,我不知道问“为什么”是否会解决任何东西 - 只需提供标题并继续.. 我更好奇您是如何设法触发服务器投诉您的请求在 GET 时具有正文,据称输入到浏览器地址栏中..跨度> 【参考方案1】:

解决方法就是在 Get 方法的 MyDataDTO 对象类型之前添加 [FromUri],例如:

[AllowAnonymous]
[HttpGet]
public IHttpActionResult GetData([FromUri] MyDataDTO publicInfo)

    
    return Ok(publicInfo);

【讨论】:

以上是关于为啥在路由到 REST WebAPI 获取方法时需要内容类型标头?的主要内容,如果未能解决你的问题,请参考以下文章

在路由匹配发生之前拦截所有 WebApi 调用

为啥在php中使用cropper js上传图像时需要不工作

ASP.NET WebApi 从入门到"放弃"系列---WebApi 请求路由

WebAPI 核心路由问题

webapi简介及参数绑定

为啥调用 webapi 方法会引发错误,即路径无效?