将其归结为最简单的规则:
<rule name="Reverse Proxy" stopProcessing="true">
<match url="^external/(.*)" />
<action type="Rewrite" url="http://some-site/{R:1}" />
</rule>
(在服务器级别的ARR服务器代理设置中选中“启用代理”)。
上述重写规则在一个非常简单的测试应用程序中运行良好,其中包含该部分的web.config,它在Web表单应用程序中工作正常,但如果我将相同的规则放入MVC3应用程序(在同一台机器上,如此相同的IIS配置更高)它永远不会有任何影响;请求流过。
如果只是重写(而不是反向代理),它可以正常工作,例如,
<rule name="rewrite to internal" stopProcessing="true">
<match url="^internal/(.*)" />
<action type="Rewrite" url="different-internal/{R:1}" />
</rule>
......很好。
如果我添加
,我可以使用反向代理规则 routes.IgnoreRoute("external/{*pathInfo}");
在Global.asax.cs类中的,以便我对外部/ *的请求没有达到默认控制器,但我不明白为什么。我认为URL重写模块在路由之前就开始了(参见http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/),所以我希望它们之间没有冲突。
路由模块是否在URL重写模块中添加了“虚拟”重写规则,这些规则会覆盖我声明的重写规则?
答案 0 :(得分:4)
我遇到了同样的问题,我花了一整天才找到the solution.
查找:Web.config文件中的ServoceModel标记,并添加serviceHostingEnvironment代码,如下所示:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
这将允许路由传递到IIS来处理它。
还有一个提示,我建议任何有MVC项目路由问题的人通过NuGet安装Remote Debugger。这将告诉您何时激活哪些路线。