【发布时间】:2015-06-24 16:55:04
【问题描述】:
我对 HttpHandlers 和 HttpModules 进行了一些研究,但我不清楚按照我的规范实现它的最佳方式。
我的问题是 StaticFile 处理程序处理所有带有扩展名的 url,并将返回默认的 IIS 404 页面,而不是访问我的 ErrorsController 的 NotFound 操作。我想使用 MVC 来处理所有 404,因为使用 .cshtml 页面而不是 .html 页面的好处,以及我执行日志记录和所有 404 响应以及页面包含一些动态内容的事实。
我不想启用<modules runAllManagedModulesForAllRequests="true">,因为它会影响性能,而且这样做似乎是错误的方式。
创建一个 HttpModule 并让它检查请求的文件是否存在,如果找不到,将请求发送到托管管道并最终发送到我的ErrorsController 处理请求是否可行?
【问题讨论】:
-
未确认,但 global_asax
Application_Error不会发现所有错误吗?还是静态文件绕过这个? -
不,静态文件不会到达托管管道。我正在使用更强大的
Application_EndRequest。有趣的是,某些文件扩展名之所以这样做,是因为它们是由StaticFile以外的处理程序处理的。 .cshtml、.axd、.rem、.aspq、.vbhtml 等扩展名都通过托管管道运行,并带有我可以捕获的正确 404 消息。 -
IIS(自定义错误页面)允许您使用 302 重定向进行响应,您可以根据状态代码设置该重定向。因此,您的 404 错误可以通过 url 响应您的应用程序。不过我从来没有尝试过。
-
@Jasen 我认为我无法获取原始请求路径或任何要记录的请求参数。我还尝试记录 iis 将在拒绝请求时填充的子状态代码,例如,它包含双重转义字符。
-
我不确定我是否完全理解,所以请原谅我,但您能否在 web.config 中使用
httperrors(或customerrors,如果您有较旧的 IIS),请指出特定代码到Error控制器中的方法,从Request中提取任何您想要的日志并提供所需的状态代码和cshtml 视图?有关更多详细信息(如果相关),请参见此处:stackoverflow.com/questions/28989026/…
标签: asp.net asp.net-mvc asp.net-mvc-4