iis-7 - System.Web.Routing处于 Activity 状态时,为什么反向代理重写规则停止工作?

原文 标签 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类中,这样我对external / *的请求不会到达默认控制器,但是我不明白为什么。我认为URL重写模块会在路由之前启动(请参阅http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/),因此我希望它们之间不会发生冲突。

路由模块是否在URL重写模块中添加了“虚拟”重写规则,从而覆盖了我声明的重写规则?

最佳答案

我遇到了完全相同的问题,花了整整一天的时间才能找到the solution.

  • 查找:在Web.config文件中的ServoceModel标记并添加serviceHostingEnvironment代码,如下所示:
          <system.serviceModel>
            <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
          </system.serviceModel>
    

  • 这将允许路由通过IIS处理。

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

    相关文章:

    asp.net-mvc - 无法在Web服务器“localhost”上启动调试

    asp.net-mvc-4 - 我应该如何在MVC 4中使用ReturnUrl = ViewBag.ReturnUrl

    c# - 具有验证的MVC自定义路由

    asp.net-mvc - MVC bundle 包和IIS虚拟目录(URL重写)

    c# - 有关IHttpModule.Dispose和Application_End的问题

    php - php-用动态主机名重写url

    java - GWT中不含哈希(#)的URL

    iis - 无法获取IIS URL重写规则来修复URL中的%3F和%3D

    asp.net-mvc - ASP.Net MVC3路由问题

    asp.net - Asp.NET Web API-405-不允许使用用于访问此页面的HTTP动词-如何设置处理程序映射