【问题标题】:Custom error page for Http error 404.13 ASP.NET Core MVCHttp 错误 404.13 ASP.NET Core MVC 的自定义错误页面
【发布时间】:2016-12-03 13:10:36
【问题描述】:

总的来说,我对 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 - Not Found 或 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 应用程序处理的。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-core


    【解决方案1】:

    旧帖子,但仍然相关。我的 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>
    

    【讨论】:

      【解决方案2】:

      你是对的。 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>
      

      【讨论】:

      • 非常推荐 MVC Core。我删除了我的中间件并添加了 httpErrors 模块,因为每个错误的路径属性都允许一个值,例如 path="/Error/CustomAction" 我可以使用错误控制器处理我的自定义错误页面/视图。
      • 在这种情况下,能够与 Visual Studio 实时/远程连接会很棒.. 否则,这是一个成功或失败,并且不断重复发布/测试并希望最好的是一个真正的痛点。
      • 不过我很好奇,如果您想通过咆哮系统处理发送给客户端的消息并且发生这种重定向会发生什么。
      猜你喜欢
      • 2014-06-27
      • 1970-01-01
      • 2018-12-03
      • 2018-03-12
      • 2013-06-08
      • 2015-11-14
      • 2011-08-13
      • 1970-01-01
      • 2011-01-17
      相关资源
      最近更新 更多