在web.config中使用httpErrors时未触发错误控制器

时间:2014-11-18 11:47:39

标签: c# asp.net asp.net-mvc asp.net-mvc-4 iis

我正在努力在我的httpErrors中正确设置web.config部分以捕获ASP.NET MVC errorsIIS errors。我收到403状态代码和空白页面。我通过在URL中键入错误的URL和文件名来测试404错误,例如:

www.mywebsite.com/test
www.mywebsite.com/test.html

我使用的是ASP.NET MVC 5的最新版本。此Web应用程序在IIS 7.5上运行,其中包含使用integrated mode的应用程序池。

这就是我web.config在应用程序根目录中的样子(这就是我现在所拥有的):

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <appSettings>
        <add key="webpages:Version" value="3.0.0.0"/>
        <add key="webpages:Enabled" value="false"/>
        <add key="ClientValidationEnabled" value="true"/>
        <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    </appSettings>

    <system.web>
        <customErrors mode="Off" />
        <compilation debug="true" targetFramework="4.5.2"/>
        <httpRuntime targetFramework="4.5.2"/>
    </system.web>

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

    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed"/>
                <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
            </dependentAssembly>
            <!-- ...and so forth... -->
        </assemblyBinding>
    </runtime>
</configuration>

我的global.asax.cs文件:

public class MvcApplication : HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }

    protected void Application_Error()
    {
        // Break point has been set here for testing purposes
    }

    protected void Application_EndRequest()
    {
        if (Context.Response.StatusCode == 404)
        {
            // Break point has been set here for testing purposes
        }
    }
}

我的错误控制器:

public class ErrorController : Controller
{
    public ActionResult Index()
    {
        // Break point has been set here for testing purposes
        Response.StatusCode = 500;

        return View();
    }

    public ActionResult Forbidden()
    {
        // Break point has been set here for testing purposes
        Response.StatusCode = 403;

        return View();
    }

    public ActionResult NotFound()
    {
        // Break point has been set here for testing purposes
        Response.StatusCode = 404;

        return View();
    }
}

他们在Views文件夹中有相应的观点。

我的断点在我的错误控制器中永远不会被击中。我不明白为什么?我在Stackoverflow上看了很多例子,这就是每个人都建议我这样做的原因。根据我的代码,什么时候不能达到断点?所有这一切都是403错误状态和BLANK白页。命中Application_Error()Application_EndRequest()中的断点,但不是错误控制器中的断点。

我可以在Application_Error()Application_EndRequest()中编写代码,让我设置错误控制器和操作方法,但为什么我可以使用web.config?这也应该有用吗?

1 个答案:

答案 0 :(得分:0)

伙计,你已经提到statusCode为404然后你怎么能期望200 OK? :)

从动作方法

中删除Response.StatusCode = 404;

Bellow代码应该可以使用

 public ActionResult NotFound()
    {
        return View();
    }

Check this image. Working example