我有一个HttpHandler来处理404错误,这是我多年前实现的一种做url路由的方法。如果请求映射到有效页面,则会重定向到该页面。否则,它返回404.(我知道我应该开始使用asp.net 4.0的新路由功能,但这需要一些时间。我需要尽快使用它。)
在IIS6中,我将404错误映射到“/404.ashx”。在web.config中,自定义错误的设置如下:
<customErrors mode="On" defaultRedirect="error.aspx">
<error statusCode="404" redirect="/404.ashx"/>
</customErrors>
和http处理程序:
<httpHandlers>
<add verb="GET" path="404.ashx" type="myNamespace.PageNotFoundHandler,myAssemblyName"/>
</httpHandlers>
这已经工作了多年 - 我一改变网站使用asp.net 4.0就停止了工作。所有内容都重新编译为4.0,并且没有代码更改。
现在,当我点击其中一个曾经工作过的网址时,我得到一个带有404错误代码的空白页面。如果我删除IIS 404错误映射,我会得到一个常规的旧404页面。似乎没有调用httphandler。
我有其他的http处理程序正常工作。
我已将注册表中的EnableExtensionlessUrls项设置为0,如建议的here和其他地方。
我认为必须有一些我错过的配置设置或类似的东西。当然,这只是我的生产服务器上的一个问题,因此我无法在调试器中运行它以查看发生了什么。如果没有任何简单的方法,我会在我的系统中插入一些额外的记录来帮助追踪它。
关于我还能检查什么的任何想法?
答案 0 :(得分:1)
你可能会检查它是否是动词属性,也许它应该是POST或*?
另一个快速解决方法是将代码添加到全局类中的Application_Error事件处理程序中,如此。
for (Ex = Server.GetLastError(); Ex != null; Ex = Ex.InnerException)
{
if (Ex is HttpException && ((HttpException)Ex).GetHttpCode() == 404 && Context != null)
{
Context.Server.Transfer("~/404.ashx");
return;
}
}
这将消除对Web配置内部任何配置设置的需要,但它可能与您当前使用的内容有所不同,因为它将采用当前请求的页面/文件的页面标识而不是传递路径在查询字符串中处理正常的IIS 404自定义错误页面。
答案 1 :(得分:1)
从默认应用程序池更改为经典应用程序池为我修复了它。