在IIS7和Vista上,使用ASP.NET 2进行URL重写时遇到的问题

3
我有一个在ASP .NET 2 / IIS7 / Vista下运行的网站。我有一个URL重写模块,允许我使用无扩展名的URL。为了使其正常工作,我已经配置了config文件的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

这可能有点冒险,但是您是否尝试在IIS内部进行实际的配置更改?

我知道使用web.config应该是100%无懈可击的,但我看到过一些情况,在其中仅通过在IIS中进行配置才能使其正常工作。


有趣,你还有其他修改配置的东西吗?或者有其他全局处理程序注册吗?这个应用程序是虚拟目录吗? - Mitchel Sellers
据我所知,没有其他东西修改了配置。该代码正在运行网站而不是虚拟目录。我已经在问题本身中添加了一些配置示例。 - gilles27
我在IIS 7.0中遇到了通配符支持无法正常工作的问题。您可能需要尝试在添加处理程序之前添加<remove />,以确保在您的内容之前没有其他内容正在运行。 - Nick Berardi

0

谢谢,但我需要自己的重写程序,因为我们的重写非常定制化。我也相当有信心,重写工作正常,只是静态文件请求没有正常工作。 - gilles27

0

谢谢,但我需要自己的重写器,因为我们的重写方式非常定制化。我也相当有信心重写是正常工作的,只是静态文件请求没有正常工作。 - gilles27

0
  1. 如果您正在运行经典管道模式,则不需要 <system.webServer> 部分,它仅适用于集成模式。
  2. 启用通配符脚本映射

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

    2. 单击处理程序映射

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

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

    5. 在询问是否确认映射的消息框中单击“是”

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

这应该就足够了。


我已经尝试过这个方法,但仍然遇到了同样的问题。我还注意到,在使用IIS进行您建议的更改后,如果我回到Visual Studio,配置文件中会出现一个新的<system.webServer>部分。 - gilles27

0

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

在我的URL重写模块中,重写请求路径的代码在Init方法中,而应该放在Application.BeginRequest处理程序中。这就解释了为什么重写只在网站第一次访问时起作用。

对不起,浪费了大家的时间!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接