我无法在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
使用这个我删除了一些处理程序,现在Wireshark将请求捕获到后端服务器。我相信这种删除处理程序的方法是不正确的。可能是我以错误的方式配置了什么?
无论如何,当我对http://mywebapp.com/SpotfireWeb/AjaxService.asmx/InitiateOpen
的POST请求没有处理并且从我的初始应用程序收到404错误时,我将一个模块移除一个我遇到问题。当我删除* .asmx处理程序时,我仍然遇到同样的错误。这就是我现在卡住的地方。
我的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处理程序中的根本原因,但无法理解在哪里。
答案 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" });
}
}