Url.Content 安装 UrlRewrite 模块并在传递的参数中使用 ~(代字号)时抛出异常

Url.Content throws exception when UrlRewrite module is installed and using ~(tilde) in passed parameter

问题是:

  1. 我已经在我的 IIS 上为 "A" 网站
  2. 安装了 UrlRewrite 模块
  3. 我有 "B" 网站 (MVC 5.0),它不使用 'UrlRewrite' 模块,但在调用 UrlHelper.Content("~/blobl/foo/bar")。 异常是因为使用 UrlRewriter 模块并同时使用 ~ 字符作为函数参数。 例外情况是:

    System.ArgumentException:值不在预期范围内。 在 System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 错误代码,IntPtr 错误信息) 在 System.Web.Hosting.IIS7WorkerRequest.GetServerVariableInternal(字符串名称) 在 System.Web.WebPages.UrlRewriterHelper.WasThisRequestRewritten(HttpContextBase httpContext) 在 System.Web.WebPages.UrlUtil.GenerateClientUrlInternal(HttpContextBase httpContext,字符串 contentPath) 在 System.Web.WebPages.UrlUtil.GenerateClientUrlInternal(HttpContextBase httpContext,字符串 contentPath) 在 System.Web.WebPages.UrlUtil.GenerateClientUrl(HttpContextBase httpContext, String contentPath)

如果我卸载UrlRewrite模块,一切都会好的,但是"A"网站遇到问题。此外,我找不到任何方法来仅针对网站禁用此模块。

注意:我已经检查过 IIS URL Rewrite module: Url.Content() does not resolve CSS/Image path properly 但我不想更改源代码。

我建议您添加 B 网站的 URL 以忽略 URL 重写列表。

在您的 web.config 中添加以下内容:

<rule name="Ignore URLs" stopProcessing="true">
    <match url="(.*)" />
    <conditions logicalGrouping="MatchAll">
        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
        <add input="{REQUEST_URI}" negate="true" pattern="^/blobl/foo/bar\.aspx$" ignoreCase="true" />
        <add input="{REQUEST_URI}" negate="true" pattern="^/blobl/foo/bar/gar\.aspx$" ignoreCase="true" />
    </conditions>
</rule>

经过长时间的搜索,我发现没有常规方法可以在不影响其他网站的情况下为网站启用 UrlRewrite模块。
最简单的方法是: 通过 web.config 文件中的以下行从受影响的网站中删除此模块:

<configuration>
 <system.webServer>
   <modules>
      <remove name="RewriteModule" />
   </modules>
 </system.webServer>
</configuration>

有关更多信息,请查看:https://www.iis.net/configreference/system.webserver/modules