使用MVC 5应用程序的IIS反向代理配置问题

时间:2016-03-30 06:43:28

标签: asp.net-mvc iis reverse-proxy iis-8 spotfire

我无法在IIS 8.5中为我的MVC5应用程序正确配置反向代理。我们使用第三方应用程序Tibco Spotfire WebPlayer 7.0.1集成到我们的MVC webapp中。为此,我们使用Javascript API从WebPlayer打开报表并将其插入iframe。

我们必须配置反向代理以允许请求进入安装了WebPlayer的后端服务器。我们的主要webapp位于http://mywebapp.com/,所有应该重写的请求看起来像http://mywebapp.com/SpotfireWeb/...,后端服务器位于私有IP http://172.29.1.7/SpotfireWeb/...

我使用ARR 3.0和URL重写模块2.0配置反向代理的主要问题,但它不适用于* .ashx,* .aspx,* .axd,* .asmx文件。看起来某些处理程序与ARR / RewriteModule冲突,并且不允许将请求传递到其他服务器

详情

当我尝试加载像http://mywebapp.com/SpotfireWeb/secret.html这样的静态html文件时,请求被重写为172.29.1.7服务器,我得到了这个文件的内容。但是,当我请求http://mywebapp.com/SpotfireWeb/GetJavaScriptApi.ashx?Version=6.0之类的内容时,mywebapp.com会出现404错误。我运行Wireshark并发现,如果请求包含* .ashx文件,对后端服务器172.29.1.7的请求根本不会发生。 我安装了Failed Requests Trace,发现事件HANDLER_CHANGED发生了ApplicationRequestRoutingHandler更改为System.Web.Mvc.MvcHandler Failed Requests Trace

使用这个我删除了一些处理程序,现在Wireshark将请求捕获到后端服务器。我相信这种删除处理程序的方法是不正确的。可能是我以错误的方式配置了什么? enter image description here web.config

无论如何,当我对http://mywebapp.com/SpotfireWeb/AjaxService.asmx/InitiateOpen的POST请求没有处理并且从我的初始应用程序收到404错误时,我将一个模块移除一个我遇到问题。当我删除* .asmx处理程序时,我仍然遇到同样的错误。这就是我现在卡住的地方。

Trace from IE

我的mywebapp.com的web.config重写规则。我在网站级别配置了它:

        <rewrite>
        <rules>
            <rule name="ReverseProxyInboundRule1" enabled="true" stopProcessing="true">
                <match url="SpotfireWeb/?(.*)$" />
                <action type="Rewrite" url="http://172.29.1.7/SpotfireWeb/{R:1}" logRewrittenUrl="true" />
                <serverVariables>
                    <set name="ORIGINAL_HOST" value="{HTTP_HOST}" />
                </serverVariables>
            </rule>
        </rules>
        <outboundRules>
            <clear />
            <rule name="ReverseProxyOutboundRule1" preCondition="" enabled="true">
                <match filterByTags="A, Area, Base, Form, IFrame, Img, Input, Link, Script" pattern="SpotfireWeb/?(.*)" />
                <conditions logicalGrouping="MatchAll" trackAllCaptures="true" />
                <action type="Rewrite" value="http://mywebapp.com/SpotfireWeb/{R:1}" />
            </rule>
            <rule name="ReverseProxy_Redirection" preCondition="IsRedirection" enabled="true">
                <match filterByTags="A, Area, Base, Form, IFrame, Img, Input, Link, Script" serverVariable="RESPONSE_Location" pattern="^http://[^/]+/(.*)" />
                <conditions logicalGrouping="MatchAll" trackAllCaptures="true">
                    <add input="{ORIGINAL_HOST}" pattern=".+" />
                    <add input="{URL}" pattern="^/(SpotfireWeb)/?.*" />
                </conditions>
                <action type="Rewrite" value="http://{ORIGINAL_HOST}/{C:1}/{R:1}" />
            </rule>
            <preConditions>
                <preCondition name="IsRedirection">
                    <add input="{RESPONSE_STATUS}" pattern="3\d\d" />
                </preCondition>
            </preConditions>
        </outboundRules>
    </rewrite>

有人见过类似的东西吗? 我假设MVC处理程序中的根本原因,但无法理解在哪里。

1 个答案:

答案 0 :(得分:0)

我修好了。显然我们不需要删除模块。答案基本上是failed requests的日志。 在MAP_REQUEST_HANDLER事件期间,ASP.NET基础结构确定当前请求的请求处理程序。在我的情况下,每当我请求像/SpotfireWeb/...这样的URL时选择MVC处理程序,无论ARR是当前处理程序。 Here我发现:

  

..可以在MAP_REQUEST_HANDLER事件中的请求执行期间更改处理程序映射。这允许URL重写等方案起作用。

我的修复是完全从MVC路由中删除SpotfireWeb。因此,我将以下代码添加到RouteConfig.cs

routes.IgnoreRoute("SpotfireWeb/{*pathInfo}");

整个班级看起来像:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // ignore everything under 'SpotfireWeb' because this request will be routed 
        // to separate server via reverse proxy ARR/Rewrite module
        routes.IgnoreRoute("SpotfireWeb/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { area = string.Empty, controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { "GKSPortal.Controllers" });
    }
}