如果我的标头中根本没有 Content-Type,ASP.NET Core Web API 管道的流程是啥?

Posted

技术标签:

【中文标题】如果我的标头中根本没有 Content-Type,ASP.NET Core Web API 管道的流程是啥?【英文标题】:What is the flow of ASP.NET Core Web API pipeline if I do not have Content-Type at all in my header?如果我的标头中根本没有 Content-Type,ASP.NET Core Web API 管道的流程是什么? 【发布时间】:2020-11-21 16:00:22 【问题描述】:

我正在尝试解决这个问题,如果客户端在到达我的控制器之前在其标头中没有内容类型,我想显示我的 OWN 错误消息。不是 [ApiController] 通用问题详细信息消息,而是完全我自己的 JSON 对象。我一直试图弄清楚这一点,我至少知道在我的控制器上使用 [ApiController] 属性会给我 4XX 错误代码的问题详细信息响应。我删除了这个,现在我有空的响应体。我想要与响应相同的状态代码,只是不同的主体/对象。解决这个问题的最佳方法是什么?我想知道流程,这样我就可以提前捕捉到这个错误并用我自己的 JSON 对象返回我的响应

【问题讨论】:

可能是在 Mvc 之前运行的 Middleware? 【参考方案1】:

您可以使用中间件解决此问题。以下是您可以创建并连接到 HTTP 管道的示例中间件类

public class InterceptContentType

    private RequestDelegate _next;

    public InterceptContentType(RequestDelegate next)
    
        this._next = next;
    

    public async Task Invoke(HttpContext context)
    
        // This is where you can intercept the content type as shown below
        // and perform what you need
        context.Request.Headers[HeaderNames.ContentType] = "application/xml";
        await _next.Invoke(context);
    

将此类连接到您的 HTTP 管道就像将以下语句添加到 Startup.cs 类中的 Configure() 方法一样简单

app.UseMiddleware<InterceptContentType>();

【讨论】:

嘿,谢谢你的回答。我现在才看到这个。我使用 app.UseStatusCodesPages 中间件解决了这个问题,但我会尝试这种方法,非常感谢您的回复。我很感激。

以上是关于如果我的标头中根本没有 Content-Type,ASP.NET Core Web API 管道的流程是啥?的主要内容,如果未能解决你的问题,请参考以下文章

基于 Content-Type 标头的 Expressjs 路由器

从扩展生成内容类型标头

为RSpec和Rails-API设置Content-Type标头

如果 'Content-Type: application/json' 在标头中,则未创建 PHP 5.4.9 $_POST 超全局

访问前端代码中express.js中设置的标头

SOAP 消息传递需要 HTTP Content-Type 标头,但没有找到