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

时间:2016-07-28 23:25:18

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

我对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 Configure方法中插入一些中间件来实现一个自定义错误页面来处理HttpException并重定向它但我真的迷失了这个问题。

通过在我的configure方法中使用以下内容,我成功地将以下中间件用于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应用程序处理的。

2 个答案:

答案 0 :(得分:1)

你是对的。 IIS在进入您的管道之前就抓住了错误。我建议您将<?php // Insert your data for mysql connection $servername = ""; $username = ""; $password = ""; $database = ""; // Create connection $conn = mysqli_connect($servername, $username, $password, $database); // Check connection if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } $sql = "SELECT pagosVerificados.pagoID AS pagoid, SUM(pagos.pagoMonto) AS pmSum, cursosUsuarios.userID, cursos.cursoID, cursos.nombreCurso, cursos.cursoPrecio FROM pagos JOIN pagosVerificados ON pagos.pagoID = pagosVerificados.pagoID LEFT JOIN cursosUsuarios ON pagosVerificados.cursoID = cursosUsuarios.cursoID JOIN cursos ON cursosUsuarios.cursoID = cursos.cursoID WHERE cursosUsuarios.userID = 16 AND cursos.nombreCurso = 'alfa' GROUP BY cursos.nombreCurso"; $result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) { while($row = mysqli_fetch_assoc($result)) { echo $row["cursoPrecio"].'<br/>'; echo '-'.$row["pmSum"].'<br/>'; echo $row["cursoPrecio"] - $row["pmSum"]; } } else { echo "0 results"; } mysqli_close($conn); ?> 模块添加到httpErrors并将其指向网站上的某个页面。

web.config

答案 1 :(得分:0)

旧帖子,但仍然有意义。我的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>