2016-08-03 9 views
0

Ich arbeite an einem Codeabschnitt, der eine API-Anforderung an einen WebAPI-Controller übernehmen und dadurch einen WCF-Webdienst aufrufen würde. Dies würde blockieren, bis der WCF-Dienst reagiert und Probleme wie Timeouts und Leistungsprobleme verursacht. Ich kann Async/-App nicht für diesen speziellen Anwendungsfall aus einer Reihe von Gründen verwenden, die außerhalb meiner Kontrolle liegen.Rufen Sie den WCF-Dienst von einem Hintergrundthread an

Ich suche diesen WCF Anruf aus auf einem separaten Thread zu treten, so in der WebAPI Controller ich etwas tun:

New Thread(()=>{ 
    //Call WCF service here 
    //Do something with the response 
}).Start(); 

jedoch der Code Sprengung. Die Zeile, die den WCF-Dienst aufruft, wurde unverändert in den obigen Codeblock verschoben, aber jetzt erhalte ich:

Zugriff auf ein entsorgtes Objekt nicht möglich. Objektname: 'System.ServiceModel.Channels.ServiceChannel'.

am Stack-Trace der Suche, wenn die Ausnahme ausgelöst wird, kann ich den Server-Stack-Trace sieht wie folgt aus:

Server-Stack-Trace: bei System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrImmutable() bei System.ServiceModel.Channels.CommunicationObject.Open (Timespan timeout) bei System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call (ServiceChannel Kanal, Span timeout) bei Syst em.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce (Timespan Timeout, CallOnceManager Kaskade) bei System.ServiceModel.Channels.ServiceChannel.Call (String action, Boolesche Einwege, ProxyOperationRuntime Betrieb Object [] in, Object [] outs, Timespan Timeout) bei System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage method, ProxyOperationRuntime Betrieb) bei System.ServiceModel.Channels.ServiceChannelProxy.Invoke (IMessage Nachricht)

im nicht sehr groß erfahrenen mit WCF so fragte sich, ob es etwas komisch in Bezug auf cal war Ling diesen Service in einem Hintergrund Thread oder wenn es etwas anderes musste ich stattdessen tun?

Ich habe versucht, diese googeln, aber alle Ergebnisse sind im Zusammenhang einen Hintergrund-Thread von innerhalb einen WCF-Dienst zu rufen, nicht einen WCF-Dienst von ein Hintergrund aufrufen.

Irgendwelche Ideen?

Antwort

0

Also ich fand das am Ende heraus.Es war ein Unity-Problem. Aus irgendeinem Grund, während der vorhandene Code war:

container.RegisterType<IMyServiceWrapper, MyServiceImplementation>() 

ich Unity explizit hatte zu sagen, wie der Konstruktor Parameter zu beheben:

container.RegisterType<IMyServiceWrapper, MyServiceImplementation>(
    new InjectionConstructor(container.Resolve<IMyDependentService>())); 
Leider

, habe ich keine Ahnung, warum dies erforderlich war, oder warum es behoben?

0

Ich bin ziemlich sicher, dass Sie Instanz von WCF-Dienst außerhalb Thread erstellen. So zuvor sah es so aus:

using(var client = new WcfServiceClient()) 
{ 
    client.CallSomeMethod(); 
} 

Und Sie änderte es zu so etwas wie:

using(var client = new WcfServiceClient()) 
{ 
    new Thread(() => { 
     client.CallSomeMethod(); 
    }).Start(); 
} 

Und was müssen Sie ist auf Client-Erstellung in Gewinde zu bewegen:

new Thread(() => { 
     using(var client = new WcfServiceClient()) 
     { 
      client.CallSomeMethod(); 
     } 
    }).Start(); 
} 
Verwandte Themen