【发布时间】:2010-09-26 02:17:47
【问题描述】:
我在 IIS7 上运行的 ASP.NET 3.5 应用程序中使用 Context.RewritePath()。
我在应用程序 BeginRequest 事件中执行此操作,并且一切正常文件。
对 /sports 的请求被正确地重写为 default.aspx?id=1,依此类推。
问题在于,在我的 IIS 日志中,我看到 GET 请求是针对 /Default.aspx?id=1 而不是针对 /sports。
这种代码在 IIS6 下完美运行。
由于必须实现一些业务逻辑,因此不能选择使用 Microsoft Rewrite 模块。
谢谢。
编辑:
似乎我的处理程序在管道中为时过早,但如果我将逻辑移至稍后的事件,那么整个重写操作将不起作用(为时已晚,StaticFileHandler 会接收我的请求)。
我用谷歌搜索和搜索,四处询问,不敢相信没有人有这个问题?
编辑:
哎呀!这是我在 IIS 论坛上找到的:
“这是因为在集成模式下,IIS 和 asp.net 共享一个公共管道,并且 RewritePath 现在被 IIS 看到,而在 IIS6 中,它甚至没有被 IIS 看到 - 您可以通过使用经典模式来解决这个问题会表现得像 IIS6。”
最终更新:请看my answer below,我在生产环境一年多后更新了结果。
【问题讨论】:
-
我会(并且已经)通过反射器查看 System.Web.Routing 程序集。看看在哪里连接它。 IIRC,您需要在 PostMapRequestHandler 和 PostAcquireRequestState 处进行。
-
我确实尝试过,正如我在编辑中所写的那样,但该事件在管道中为时已晚......
-
我重读了您的更新。有没有办法在应用程序的某处附加事件处理程序?我的意思是请求必须在某个地方结束。我的自定义重写实验也被证明是困难的。
-
我尝试了几乎所有的事件。要么我失去日志记录,要么重写太晚,要么我失去会话状态...... :(我不敢相信没有人有这些问题?
-
Muerte,正确的做法是回答你自己的问题。您说通过将 IIS 7 置于经典模式可以解决此问题,该模式的执行方式与 IIS 6 相同。只要您意识到这样做不会从新 IIS 7 中的安全性或性能升级中受益这似乎是一个合理的答案。
标签: c# asp.net iis-7 url-rewriting logging