我已经对HttpHandlers和HttpModules进行了一些研究,我不清楚按照我的规范实现这个的最佳方法。
我的问题是StaticFile处理程序处理所有带扩展名的网址,并返回默认的IIS 404页面,而不是访问NotFound
的{{1}}操作。我想使用MVC来处理所有404,因为在.html页面上使用.cshtml页面的好处以及我执行日志记录和所有404响应以及页面包含一些动态内容的事实。
我不想启用ErrorsController
,因为它会导致性能影响,因为这似乎是错误的方法。
创建一个HttpModule是否合理并检查是否存在所请求的文件,如果没有找到,则将请求发送到托管管道并最终发送到我的<modules runAllManagedModulesForAllRequests="true">
来处理请求?
答案 0 :(得分:0)
我的解决方案处理来自未经身份验证的用户的所有 404,这包括所有带有文件扩展名的 url。此解决方案的好处是 existingResponse='Auto'
确定 ErrorController
是否已处理 404,如果是,它将跳过此步骤,但如果没有,请使用提供的自定义错误页面。
您必须使用 Response.TrySkipIisCustomErrors = true;
跳过 IIS 自定义错误。
您可能需要在方法中使用 Response.StatusCode = (int)HttpStatusCode.NotFound;
在您的ErrorController
[HttpGet]
public ActionResult 404()
{
Response.StatusCode = (int)HttpStatusCode.NotFound;
Response.TrySkipIisCustomErrors = true;
return View("Index", new ErrorModel
{
//Fill in properties values you have in your ErrorModel.
});
}
在您的 webconfig
中。
<httpErrors errorMode="Custom" existingResponse="Auto">
<remove statusCode="404" />
<error statusCode="404" path="/Error/404" responseMode="ExecuteURL" />
</httpErrors>