2016-03-30 18 views
0

Ich kann Reverse-Proxy in IIS 8.5 für meine MVC5-Anwendung nicht ordnungsgemäß konfigurieren. Wir verwenden die Drittanbieter-Anwendung Tibco Spotfire WebPlayer 7.0.1, um sie in unsere MVC-Webapp zu integrieren. Dazu verwenden wir die JavaScript-API, um den Bericht von WebPlayer zu öffnen und ihn in iframe einzufügen.IIS-Reverse-Proxy-Konfigurationsprobleme mit MVC 5 App

Wir müssen Reverse-Proxy konfigurieren, damit Anfragen an Backend-Server mit installiertem WebPlayer gesendet werden können. Unser Haupt Webapp bei http://mywebapp.com/ und alle Anfragen gelegen, die Rewrite sieht aus wie http://mywebapp.com/SpotfireWeb/..., Back-End-Server auf private IP-http://172.29.1.7/SpotfireWeb/...

Das Hauptproblem liegt sein sollte, dass ich Reverse-Proxy 3.0 und URL Rewrite-Modul ARR 2.0 mit konfiguriert, aber es doesn‘ t arbeiten für * .ashx, * .aspx, * .axd, * .asmx-Dateien. Es sieht aus wie einige Handler Konflikte mit ARR/RewriteModule und erlaubt keine Anfragen an andere Server

Einzelheiten weitergeben müssen:

Wenn ich wie http://mywebapp.com/SpotfireWeb/secret.html statische HTML-Datei zu laden versuchen, die Anforderung gewesen rewrote zu 172.29.1.7 Server und ich habe Inhalt dieser Datei. Aber sobald ich etwas wie http://mywebapp.com/SpotfireWeb/GetJavaScriptApi.ashx?Version=6.0 anfordern, habe ich 404 Fehler von mywebapp.com bekommen. Ich laufe Wireshark und entdeckte, dass Anfragen an Back-End-Server 172.29.1.7 überhaupt nicht gehen, wenn Anfragen * .ashx-Datei enthält. Ich installierte Failed Requests Trace und fand dieses Ereignis HANDLER_CHANGED aufgetreten, die ApplicationRequestRoutingHandler-System.Web.Mvc.MvcHandler geändert Failed Requests Trace

mit diesem Spiel ich einige Handler entfernt und jetzt fängt Wireshark-Anforderungen an den Back-End-Server. Ich glaube, dass dieser Ansatz des Entfernens von Handlern nicht korrekt ist. Kann ich etwas falsch konfiguriert sein? enter image description here web.config

Wie dem auch sei, das Entfernen eines Moduls von einem stand ich Problem, wenn POST-Anforderung an http://mywebapp.com/SpotfireWeb/AjaxService.asmx/InitiateOpen nicht verarbeitet hat, und ich bekam 404 Fehler von meiner ersten App. Wenn ich * .asmx-Handler entfernte, bekam ich noch den gleichen Fehler. Das ist der Punkt, an dem ich gerade feststecke.

Trace from IE

Meine Regeln für das Umschreiben von web.config von mywebapp.com. Ich konfigurierte es auf Website-Ebene:

 <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> 

Hat jemand etwas ähnliches gesehen? Ich nehme an, dass die Ursache im MVC-Handler, aber nicht verstehen, wo.

Antwort

0

Ich habe das behoben. Natürlich müssen wir keine Module entfernen. Die Antwort im Wesentlichen in Logs failed requests. Während des MAP_REQUEST_HANDLER-Ereignisses bestimmt die ASP.NET-Infrastruktur den Anforderungshandler für die aktuelle Anforderung. In meinem Fall wurde der MVC-Handler jedes Mal ausgewählt, wenn ich eine URL wie /SpotfireWeb/... anforderte, unabhängig davon, ob ARR der aktuelle Handler war. Here Ich habe Folgendes gefunden:

..die Handlerzuordnung kann während der Ausführung der Anforderung im MAP_REQUEST_HANDLER-Ereignis geändert werden. Dies ermöglicht Szenarien wie URL-Umschreiben.

Mein Fix war SpotfireWeb von MVC Routen vollständig zu entfernen.So habe ich folgenden Code in RouteConfig.cs

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

Und die ganze Klasse wie folgt aussieht:

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" }); 
    } 
}