Url.Content 安装 UrlRewrite 模块并在传递的参数中使用 ~(代字号)时抛出异常
Url.Content throws exception when UrlRewrite module is installed and using ~(tilde) in passed parameter
问题是:
- 我已经在我的 IIS 上为 "A" 网站
安装了 UrlRewrite
模块
我有 "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
问题是:
- 我已经在我的 IIS 上为 "A" 网站 安装了
我有 "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
模块
如果我卸载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