当System.Web.Routing处于活动状态时,为什么反向代理重写规则停止工作?

时间:2012-03-23 14:44:50

标签: iis-7 url-rewriting asp.net-mvc-routing

将其归结为最简单的规则:

      <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重写模块中添加了“虚拟”重写规则,这些规则会覆盖我声明的重写规则?

1 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,我花了一整天才找到the solution.

  1. 查找:Web.config文件中的ServoceModel标记,并添加serviceHostingEnvironment代码,如下所示:

          <system.serviceModel>
            <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
          </system.serviceModel>
    
  2. 这将允许路由传递到IIS来处理它。

    还有一个提示,我建议任何有MVC项目路由问题的人通过NuGet安装Remote Debugger。这将告诉您何时激活哪些路线。