httpModule为404

时间:2010-09-29 14:17:12

标签: asp.net iis http-status-code-404 httpmodule

我已经创建了一个httpModule来处理URL重映射,它在我的测试系统上运行良好。 www.mydomain.com/Some_Fancy_URL的请求会被重写为www.mydomain.com/some.aspx?fancy=23,依此类推。

当我部署到实际网站时,我正在获取默认的IIS 404页面。

在线进行一些研究之后,似乎我需要在IIS 6中设置“通配符映射”以通过IIS和我的httpModule获取请求。问题是该站点托管在共享服务器上,因此可能无法让ISP进行更改。

我的问题是,我不能使用httpHandler告诉IIS我希望如何处理这些请求?例如:

<httpHandlers>
  <add path="*.aspx" verb="GET,POST" type="System.Web.UI.PageHandlerFactory" validate="false"/>
</httpHandlers>

似乎将此添加到我的Web.Config应该告诉IIS停止验证.aspx文件的存在,并且只是传递请求以便我处理。但它不起作用。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

IIS 6和ASP.NET的问题在于它们没有集成。需要通过脚本映射(.aspx,.asmx,通配符等)告知IIS。

您的web.config配置设置都不会影响IIS,因为web.config用于配置ASP.NET的行为,而不是IIS。 IIS不了解web.config

除非您可以将请求移交给ASP.NET管道(通过脚本映射),否则不会发生任何事情,并且您的所有web.config设置都将被忽略。

使用IIS 7,故事情况完全不同。在IIS7中,ASP.NET和IIS紧密集成并共享相同的管道,从而允许您实现您正在寻找的结果。

另一种方法可能是找出您的托管服务商是否在其服务器上运行URL重写器(如ISAPI_Rewrite)。这样您就可以重写URL而无需将通配符脚本映射到IIS6。

答案 1 :(得分:1)

通过一些试验和错误,以及更多的网络搜索,我找到了一个解决方案。它基本上与Kev的答案相似。

IIS不会将请求视为.NET,除非它具有已知的文件扩展名(.aspx,.ascx等)。当我发送类似www.mydomain.com/anything之类的内容时,它会查找名为“nothing”的文件或文件夹,当它找不到时,它就会脱落到默认的IIS 404处理程序。

这就是我接手的地方。我更改了IIS 6以将404问题转发到/404.aspx。然后,我创建了一个通用的“找不到你的文件”消息的页面,其格式与我的网站相同。

以下是好消息:现在IIS正在向.NET页面发送404,我创建的自定义httpModule 被触发。该请求适用于404.aspx,但IIS也很好,也可以附加原始URL。你会得到类似的东西:

www.mydomain.com/404.aspx?404;http://www.mydomain.com/anything

这允许我在httpModule中解析请求,并根据需要重写!