3

我有一个在 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>

该站点在经典而不是集成管道模式下运行。

有没有人有任何想法?我怀疑我的配置在某处有问题,但我似乎找不到在哪里。

4

5 回答 5

0

这有点远,但是您是否尝试过在 IIS 中实际进行配置更改?

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

于 2008-12-01T14:57:28.977 回答
0

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

于 2008-12-01T17:39:09.493 回答
0

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

于 2008-12-01T17:41:02.237 回答
0
  1. 如果您在经典管道模式下运行,则不需要<system.webServer>部分,它是集成模式所必需的
  2. 启用通配符脚本映射

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

    2. 单击处理程序映射

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

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

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

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

这应该足够了。

于 2008-12-01T18:04:11.923 回答
0

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

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

很抱歉浪费了大家的时间!

于 2008-12-15T17:23:00.363 回答