2016-04-21 8 views
1

Hallo Ich verwende ein HttpModule, um WebAPI aufzurufen. Derzeit ist die Lösung arbeitet lokal im System aber sobald ich den Code in Server veröffentlicht, schlägt es die API call.Here ist der Beispielcode zu machen:Web-API-Aufruf mit IHTTP-Modul

public class AppModule: IHttpModule 
{ 
    public void Init(HttpApplication httpApp) 
    { 
     httpApp.BeginRequest += OnBeginRequest; 
     httpApp.EndRequest += OnEndRequest; 
     httpApp.PreSendRequestHeaders += OnHeaderSent; 
    } 
     public void OnBeginRequest(Object sender, EventArgs e) 
      { 
       try 
       { 
        var httpApp = (HttpApplication)sender; 
        if (httpApp.Request.Path.StartsWith("/media/")) return; 
        string a = httpApp.Request.ServerVariables["ID"]; 
        if (String.IsNullOrEmpty(a)) 
        { 
         a = System.Configuration.ConfigurationManager.AppSettings["ID"]; 
        } 
        var absolutepath = httpApp.Request.Url.AbsolutePath; 
        var values = new Dictionary<string, object> 
        { 
         { "ID", a }, 
         { "Browser",httpApp.Request.Browser["Type"] }, 
         { "Url",httpApp.Request.Url.Scheme + "://" + httpApp.Request.Url.Authority + absolutepath}, 
         { "OperatingSys",httpApp.Request.Headers["User-Agent"] }, 
         { "IPAddss",httpApp.Request.UserHostAddress }, 
         { "LDate",System.DateTime.Now.ToString() }, 
        }; 

         var serializer = new JavaScriptSerializer(); 
         var appData = serializer.Deserialize<DataVO>(serializer.Serialize(values)); 
         AppModuleVO objAppModuleVO = new AppModuleVO(); 
         //AppModuleVo has all the properties. 
         objAppModuleVO.WebUrl = System.Configuration.ConfigurationManager.AppSettings["APIURL"] + MethodCall; 
         objAppModuleVO.objDataVo = appData; 
         ThreadPool.QueueUserWorkItem(new WaitCallback(HandlePostRequest), objAppModuleVO); 

       } 
       catch (Exception ex) 
       { 

       } 
      } 
} 

ich das gleiche in Web.Config registriert haben als

<system.web> 
    <httpModules> 
     <add name="AppModule" type="Fighter.Modules.AppModule"/> 
    </httpModules> 
</system.web> 
<system.webServer> 
    <modules> 
     <add name="AppModule" type="Fighter.Modules.AppModule"/> 
    </modules> 
</system.webServer> 

ich bin nicht sicher, ob Änderungen oder Registrierung in dem IIS-Server nach der Veröffentlichung des Codes in Server vorgenommen werden muss. Hinweis: Ich habe auch die API im Server bereitgestellt und den richtigen Pfad bereitgestellt und da andere Methoden dieselbe API aufrufen können, die ausgeschlossen ist. Bitte helfen Sie. Das Problem scheint wegen der IIS derzeit bin ich benutze IIS 7.0 in Managed Pipeline-Modus als CLASSIC .Any Workarounds für dieses Problem.

+0

Was scheitert? Es gibt einen Haken. Geht es dort hin? – Asken

+0

@Asken es funktioniert perfekt, wenn ich die Lösung lokal ausführen das Problem kommt nach der Veröffentlichung des Codes auf dem Server. –

+0

Brauchen mehr Daten ... es kann alles sein. Sie müssen sich die Protokolle ansehen. Sie könnten auch versuchen, ein einfaches Modul zu erstellen, das etwas wie eine Zeichenfolge zurückgibt, um zu sehen, ob es funktioniert. Wenn ein Anruf bei externen Websites erfolgt, müssen Sie möglicherweise dafür sorgen, dass Sie dazu berechtigt sind. Wenn Sie die Kontrolle über den Server haben, können Sie versuchen, '' zu setzen. – Asken

Antwort

0

Um lange für einen Kommentar so ... versuchen Sie dies in Ihrer web.config:

.... 
<system.webServer> 
    <modules> 
     <add name="AppModule" type="Fighter.Modules.AppModule"/> 
    </modules> 
    <validation validateIntegratedModeConfiguration="false" /> 
</system.webServer> 

Having said, dass Sie IntegratedMode mit in Betracht ziehen sollten.

+0

Sind Sie sicher, dass es im klassischen Modus funktioniert, da die Serverkonfiguration aufgrund dieses Teils des Projekts nicht in die integrierte Konfiguration geändert werden kann, können andere Abhängigkeiten auftreten. –

+0

Nichts ist sicher, aber zumindest die integrierte Validierung wird entfernt. Die andere Möglichkeit besteht darin, einen neuen Anwendungspool unter Verwendung von integriert zu erstellen. Wenn Sie das dann für Ihre App verwenden, wird es die anderen nicht stören. Sie werden getrennt voneinander sein und können unabhängig voneinander gestoppt, gestartet und recycelt werden. – Asken