4.0升级后,HttpHandler for 404错误停止工作

时间:2011-02-15 15:01:24

标签: asp.net iis-6 asp.net-4.0

我有一个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和其他地方。

我认为必须有一些我错过的配置设置或类似的东西。当然,这只是我的生产服务器上的一个问题,因此我无法在调试器中运行它以查看发生了什么。如果没有任何简单的方法,我会在我的系统中插入一些额外的记录来帮助追踪它。

关于我还能检查什么的任何想法?

2 个答案:

答案 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)

从默认应用程序池更改为经典应用程序池为我修复了它。