IIS7和Vista上的ASP .NET 2的URL重写问题

时间:2008-12-01 14:48:37

标签: asp.net iis-7 windows-vista url-rewriting

我有一个在ASP .NET 2 / IIS7 / Vista下运行的网站。我有一个URL重写模块,允许我有无扩展名的URL。为了实现这一点,我配置了配置文件的system.webServer部分,以便将所有请求转发到aspnet_isapi.dll。我还将URL重写模块添加到模块部分,并将runAllManagedModulesForAllRequests设置为true。

当我启动网站并访问其中一个使用URL重写的页面时,页面会正确呈现。但是,如果我然后访问另一个页面,该网站将停止工作,我找不到404。我还发现我的URL重写模块中的断点没有被击中。这几乎就好像IIS将第一个请求转发给重写器,但后续转发到其他地方 - 错误页面提到Notification为MapRequestHandler和Handler为StaticFile。

如果我对web.config文件做了一些小改动并保存,触发网站重新启动,我就可以在浏览器中重新加载页面了,一切正常。然后我点击另一个链接再次破坏。

对于记录,这里有一些来自配置文件的片段。首先,在system.web下:

<httpModules>
  <add name="UrlRewriteModule" type="Arcs.CoopFurniture.TelesalesWeb.UrlRewriteModule, Arcs.CoopFurniture.TelesalesWeb" />
</httpModules>

然后在system.webServer:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="UrlRewriteModule" type="Arcs.CoopFurniture.TelesalesWeb.UrlRewriteModule, Arcs.CoopFurniture.TelesalesWeb" preCondition="managedHandler" />
  </modules>
  <handlers>
    <add name="AspNet" path="*" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="None" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
  </handlers>
  <validation validateIntegratedModeConfiguration="false" />
</system.web>

该网站在经典而非集成管道模式下运行。

有没有人有任何想法?我怀疑我的配置在某个地方是错的,但我似乎找不到。

5 个答案:

答案 0 :(得分:0)

这是一个很长的镜头,但您是否尝试过实际在IIS中进行配置更改?

我知道web.config方式应该是100%万无一失,但我已经看到了一些在IIS中配置它以使其正常工作的帮助。

答案 1 :(得分:0)

您还可以查看新的IIS7重写模块。你可以在http://learn.iis.net/page.aspx/460/using-url-rewrite-module/阅读更多关于它的信息,但是它可能比你自己开发的ISAPI过滤器更加可靠

答案 2 :(得分:0)

尝试http://www.codeplex.com/urlrewriter它支持所有Apache mod_rewrite语法,并且还支持反向代理。

答案 3 :(得分:0)

  1. 如果您在经典管道模式下运行,则不需要<system.webServer>部分,这是集成模式所必需的
  2. 启用通配符脚本映射

    1. 打开IIS7管理器并导航到您的站点

    2. 点击处理程序映射

    3. 在“操作”面板中,单击“添加通配符脚本映射”

    4. 在对话框中指向aspnet_isapi.dll

    5. 在要求您确认映射的消息框中单击是

    6. 在操作面板中单击“查看有序列表”并在StaticFile处理程序之前移动您的WildcardScriptMap

  3. 这应该足够了。

答案 4 :(得分:0)

我很惭愧承认这一点,但这是我的一个简单错误: - (

在我的URL重写模块中,重写请求路径的代码是在Init方法中,当它应该在Application.BeginRequest处理程序中时。这解释了为什么重写仅在网站第一次被击中时起作用。

抱歉浪费了你的时间!