繁体   English   中英

为什么发生异常时未从Mvc设置StatusCode

[英]Why is StatusCode not set from Mvc when exception occurs

在一个简单的应用程序中:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Use(async (context, next) =>
    {
        try
        {
            await next();
        }
        finally
        {
            var test = context.Response.StatusCode;
            //test=200 when exception is thrown from Mvc()
        }
    });
    app.UseMvc();
}

如果控制器抛出Exception为什么未设置Response.StatusCode 这似乎很令人惊讶,没有记载。 这似乎与管道的概念不一致,例如。 此时已设置401404 这是错误还是设计使然?

错误处理不是MVC中间件的责任/关注点。 异常只会冒出来,其他中间件(例如开发人员异常页面或异常处理程序)应该处理此错误。

您可以通过在UseMvc()调用之前添加UseDeveloperExceptionPage()UseExceptionHandler() 进行 UseMvc() 例如:

public void Configure(IApplicationBuilder app)
{
    app.UseExceptionHandler("/path/to/error/page");
    app.UseMvc();
}

在将异常返回给调用者之前,ASP.NET中间件设置了500状态代码。 如果使用Postman测试您的API,您会看到它报告状态码500。

在您的示例中看不到它的原因是,与检测异常并返回500状态代码的代码相比,您的异步功能在管线的上游。

作为实验,添加UseDeveloperExceptionPage()代码以进行Configure

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.Use(async (context, next) =>
    {
        try
        {
            await next();
        }
        finally
        {
            var test = context.Response.StatusCode;
        }
    });

    app.UseMvc();
}

使用此代码运行时,StatusCode为500。但是,如果将代码移至应用程序之后app.Use(...

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Use(async (context, next) =>
    {
        try
        {
            await next();
        }
        finally
        {
            var test = context.Response.StatusCode;
        }
    });

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseMvc();
}

在此代码中,您将发现StatusCode为500。因此,所有关于中间件设置正确状态代码的信息。 这取决于代码在管道中的位置以及所看到的状态代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM