Http错误404.13的自定义错误页ASP.NET Core MVC

本文关键字:错误 ASP NET MVC Core 自定义 Http | 更新日期: 2023-09-27 17:59:12

我对ASP.NET和MVC还很陌生;我一直在将ASP.NET MVC应用程序迁移到ASP.NET MVC Core。在前一个框架中,我能够处理以下臭名昭著的错误的HttpException:

HTTP错误404.13-找不到

请求过滤模块被配置为拒绝超过了请求内容长度。

我知道我可以增加允许上传的最大长度,目前默认为30MB,但我的目标是向用户提供一个友好的错误页面,解释刚刚发生的事情,而不是增加允许的限制。

在ASP.NET上,我在Global.asax上使用了以下代码:

private void Application_Error(object sender, EventArgs e)
{
    var ex = Server.GetLastError();
    var httpException = ex as HttpException ?? ex.InnerException as HttpException;
    if (httpException == null) return;
    if (httpException.WebEventCode == WebEventCodes.RuntimeErrorPostTooLarge)
    {
        //handle the error
        Response.Redirect("~/Error/UploadTooLarge"); //Redirect to my custom error page
    }
}

经过几个小时的研究,我似乎在Asp.Net Core中找不到替代方案。我相信我需要在我的Startup.cs配置方法中插入一些中间件,以实现一个自定义错误页面来处理HttpException并重定向它,但我真的很困惑。

通过在我的配置方法上使用以下方法,我成功地将以下中间件用于http错误的自定义错误页面,如404-未找到或403-Forbiden:

app.UseStatusCodePagesWithReExecute("/Error/StatusCode{0}");

控制器旁边:

public class ErrorController : Controller
{
    public IActionResult StatusCode404()
    {
        return View(viewName: "CustomNotFound"); 
    }
    public IActionResult StatusCode403()
    {
        return View("CustomForbiden");
    }
}

以及相应的观点。然而,404.13错误(上传太大)不会由我当前的中间件处理。我认为IIS正在显示错误,因为它不是由web应用程序处理的。

Http错误404.13的自定义错误页ASP.NET Core MVC

旧帖子,但仍然相关。我的Core 2.2 MVC项目,包括大型流文件上传,需要对404.13(请求大小太大)结果进行优雅的处理。设置状态代码处理(优美视图)的常用方法是在Startup.cs Configure()中,再加上一个要匹配的操作方法:

app.UseStatusCodePagesWithReExecute("/Error/Error", "?statusCode={0}");

public IActionResult Error(int? statusCode = null)
{
    if (statusCode.HasValue)
    {
        Log.Error($"Error statusCode: {statusCode}");
        if (statusCode == 403)
        {
            return View(nameof(AccessDenied));
        }
        if (statusCode == 404)
        {
            return View(nameof(PageNotFound));
        }
    }
    return View(new ErrorViewModel 
        {
            RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier 
        });
}

但是,由于404.13错误是由IIS处理的,而不是在MVC管道中处理的,因此上面的代码不允许建立一个优雅的"上传过大"错误视图。为了做到这一点,我不得不捏住鼻子,将以下web.config添加到我的Core 2.2项目中。请注意,删除404.13也删除了404,因此ErrorController()代码不再处理404,因此下面有两个自定义错误处理程序。希望这能帮助到别人!

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering>
        <!-- This will handle requests up to 201Mb -->
        <requestLimits maxAllowedContentLength="210763776" />
      </requestFiltering>
    </security>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="404" subStatusCode="13" />
      <remove statusCode="404" />
      <error statusCode="404"
             subStatusCode="13"
             prefixLanguageFilePath=""
             path="/Error/UploadTooLarge"
             responseMode="Redirect" />
      <error statusCode="404"
             prefixLanguageFilePath=""
             path="/Error/PageNotFound"
             responseMode="Redirect" />
    </httpErrors>
  </system.webServer>
</configuration>

你是对的。IIS在错误进入您的管道之前捕获该错误。我建议将httpErrors模块添加到web.config中,并将其指向网站上的页面。

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" subStatusCode="13" />
    <error statusCode="404"
           subStatusCode="13"
           prefixLanguageFilePath=""
           path="http://yourwebsite.com/path/to/page"
           responseMode="Redirect" />
  </httpErrors>
</system.webServer>