我正在使用HTTPContext.RewritePath作为没有扩展且在文件系统上不存在的路径。我希望它返回我的自定义404页面。我在Windows 7上使用IIS 7.5,.Net 4和Integrated Pipeline。
重写发生在名为RewriteExampleModule的HTTPModule中。如下图所示。
using System;
using System.Web;
public class RewriteExampleModule : IHttpModule
{
public RewriteExampleModule()
{
}
private void context_PostAuthorizeRequest(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
String path = context.Request.RawUrl;
if (path.IndexOf("/edit/") > -1)
{
path = path.Replace("/edit/", "/");
context.RewritePath(path);
}
}
public bool IsReusable
{
get { return true; }
}
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.PostAuthorizeRequest += new EventHandler(context_PostAuthorizeRequest);
}
}
它在模块部分配置如下,
<modules runAllManagedModulesForAllRequests="true">
<add name="RewriteExampleModule" type="RewriteExampleModule" />
</modules>
/ edit / asdf请求的结果/ asdf不存在是500错误。它应该是404,但它不是。
下面,
我已经删除了ExtensionlessUrlHandler,现在得到了404.但是,响应的主体是空的。与下面显示的重写模块一起是我的完整web.config
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0"/>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="true" />
<modules runAllManagedModulesForAllRequests="true">
<add name="RewriteExampleModule" type="RewriteExampleModule" />
</modules>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
</handlers>
<httpErrors existingResponse="Replace" errorMode="Custom">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" prefixLanguageFilePath="" path="/404error.aspx" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
</configuration>
使用此配置调用
/ edit / asdf
其中/ asdf不存在返回404状态代码,但没有在httpErrors下的web.config中指定的自定义内容。
为什么404身体是空的?没有重写/ edit /的任何其他路径都可以。