IIS7,RewritePath和IIS日志文件

我在IIS7上运行的ASP.NET 3.5应用程序中使用Context.RewritePath()。

我在应用程序BeginRequest事件中做它,一切工作文件。

/ sports的请求被正确地重写为default.aspx?id = 1,依此类推。

问题是在我的IIS日志中,我看到了对/Default.aspx?id=1的GET请求,而不是/ sports。

这种代码在IIS6下完美运行。

由于必须实现某些业务逻辑,因此不能使用Microsoft Rewrite模块。

谢谢。

编辑:

看来我的处理程序太早了,但是如果我将逻辑移到后来的事件中,那么整个重写的东西都不起作用(为时已晚,StaticFileHandler会收到我的请求)。

我用谷歌搜索和谷歌搜索,问道,不敢相信没有人有这个问题?

编辑:

哎呀! 这是我在IIS论坛上发现的:

“这是因为在集成模式下,IIS和asp.net共享一个公共管道,现在IIS可以看到RewritePath,而在IIS6中,它甚至没有被IIS看到 – 你可以通过使用经典模式来解决这个问题IIS6“。

最后更新 :请看下面我的答案 ,我在生产环境中使用了一年多的时间后对结果进行了更新。

经过一番研究,我终于找到了问题的解决方案。

我已使用新的(在ASP.NET 3.5中引入) Context.Server.TransferRequest()方法替换了对Context.RewritePath()方法的调用。

现在看起来很明显,但IIS核心团队的事件高级开发工程师并没有想到这一点。

我已经测试了它的会话,身份validation,回发,查询字符串,…问题,没有找到。

Tommorow我会将更改部署到一个非常高的流量站点,我们很快就会知道它是如何工作的。 🙂

我会回来更新。

更新:解决方案仍然不完全在我的生产服务器上,但它已经过测试,它确实有效,据我所知,到目前为止,它是我的问题的解决方案。 如果我在生产中发现任何其他内容,我会发布更新。

最后的更新:我已经在生产中使用了这个解决方案超过一年,它已被certificate是一个良好而稳定的解决方案,没有任何问题。

您可以在处理请求之后但在IIS日志记录模块写入日志条目之前将路径设置回原始值。

例如,此模块重写BeginRequest上的路径,然后将其设置回EndRequest上的原始值。 使用此模块时,原始路径将显示在IIS日志文件中:

 public class RewriteModule : IHttpModule { public void Init(HttpApplication context) { context.BeginRequest += OnBeginRequest; context.EndRequest += OnEndRequest; } static void OnBeginRequest(object sender, EventArgs e) { var app = (HttpApplication)sender; app.Context.Items["OriginalPath"] = app.Context.Request.Path; app.Context.RewritePath("Default.aspx?id=1"); } static void OnEndRequest(object sender, EventArgs e) { var app = (HttpApplication)sender; var originalPath = app.Context.Items["OriginalPath"] as string; if (originalPath != null) { app.Context.RewritePath(originalPath); } } public void Dispose() { } } 

我有完全相同的问题。 解决此问题的一种方法是使用Server.Transfer而不是Context.RewritePath。 Server.Transfer不会重新启动整个页面生命周期,因此仍会记录原始URL。 确保为“preserveForm”参数传递“true”,以便QueryString和Form集合可用于第2页。

老问题,但我发现当我做以下事情时我没有遇到你的问题:

a)web.config中的重写规则,用于将所有请求定向到/default.aspx,例如:

      

b)在default.aspx的Page_PreInit事件中调用RewritePath,将URL和查询字符串重写为请求中传递的内容(即不存在的位置)。

例如,我请求“/ somepage /?x = y”(不存在)。

a)Web.config规则将其映射到/default.aspx

b)Page_PreInit将其重写回“/ somepage /?x = y”。

在IIS 7(Express和production)中,结果是服务器日志反映了存根的“/ somepage”和查询的“x = y”,并且所有Request对象属性都反映了请求的(不存在的)URL(这就是我想要的)。

唯一奇怪的效果是,在IIS Express中,日志项被写入两次。 但是,这在生产中不会发生(Windows Server 2008 R2)。