当发生潜在危险时,处理asp mvc 5上的自定义错误

时间:2017-12-09 08:27:05

标签: asp.net asp.net-mvc

我在网址中有:时出现以下错误:

  

从客户端(:)

检测到潜在危险的Request.Path值

我希望当我的应用程序出错时我可以重定向到/Error/NotFound操作但有时它不会发生。

例如,我有以下代码来处理自定义错误并且它可以正常工作但是当我有一个潜在危险的错误时controller.Execute()没有触发。

 protected void Application_Error()
    {
        var lastException = Server.GetLastError();

        if (lastException.GetType() != typeof(HttpException))
            return;

        var httpException = lastException as HttpException;
        var routeData = new RouteData();
        routeData.Values.Add("controller", "Error");

        if (httpException?.GetHttpCode() == 404 || httpException?.GetHttpCode() == 400)
            routeData.Values.Add("action", "NotFound");

        if (routeData.Values.Count <= 1)
            return;

        try
        {
            IController controller = new ErrorController();
            controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
        }
        catch (NullReferenceException e)
        {
            Console.WriteLine(e.Message);
            throw new NullReferenceException();
        }
    }

我意识到当发生潜在危险错误时,我的上下文的某些属性(例如CurrentNotification, Handler, Items, Profile, Session and User)为空。我不确切知道我的背景是否与这个问题有关。

这是我的webconfig:

<system.web>
    <compilation debug="true" targetFramework="4.6.2" />
    <httpRuntime targetFramework="4.6.2" maxRequestLength="314572800" enableVersionHeader="false" requestPathInvalidCharacters="&lt;,&gt;,%,&amp;,:,\,?" />
</system.web>

<system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
       <remove statusCode="404" />
       <error statusCode="404" responseMode="ExecuteURL" path="/Error/NotFound" />
    </httpErrors>
</system.webServer>

1 个答案:

答案 0 :(得分:0)

您可以在Web.Config中处理所有类型的错误:

  <customErrors mode="On"  defaultRedirect="~/Error/ErrorPage/404" >
      <error statusCode="404" redirect="~/Error/ErrorPage/404" />
      <error statusCode="403" redirect="~/Error/ErrorPage/403" />
      <error statusCode="500" redirect="~/Error/ErrorPage/500" />
    </customErrors>

我添加的是

  

defaultRedirect

处理任何类型的错误