2016-05-05 9 views
4

Ich habe eine Web-API-Controller-Methode, die einen externen REST-API-Dienst mithilfe des HttpClient aufruft. Die Ergebnisse des externen REST-Aufrufs werden dann über einen Aufruf an seinen Proxy an einen WCF-Dienst übergeben.WCF-Proxy schlägt nach Aufruf externer API fehl

Wenn ich den WCF-Proxy zuerst aufrufen und dann den externen REST-Dienst aufrufen, funktioniert alles wie erwartet. Wenn ich die Reihenfolge der Aufrufe umkehren, schlägt der WCF-Proxy-Aufruf fehl, da der InnerChannel (m_inner_channel = m_channel_factory.CreateChannel()) auf dem Proxy ungültig ist.

Hier ist ein Beispiel zur Veranschaulichung ist:

//Call to external REST API Service (works) 
user = await m_http_client.GetProfileAsync(id).ConfigureAwait(false); 

//Call to WCF Service (works) 
using (WCFServiceProxy wcf_proxy = new WCFServiceProxy()) 
{ 
    config = await wcf_proxy.GetConfigAsync(user.ssid).ConfigureAwait(false); 
} 

Der obige Code funktioniert, aber wenn ich den Code unter dem InnerChannel des WCF-Proxy implementieren (m_inner_channel = m_channel_factory.CreateChannel()) ist null, wenn ich das machen rufen sie an den Service:

//Instantiate WCF Proxy - Creates ChannelFactory 
WCFServiceProxy wcf_proxy = new WCFServiceProxy() 

//Call to external REST Service (works) 
user = await m_http_client.GetProfileAsync(id).ConfigureAwait(false); 

//Call to WCF Service (InnerChannel is no longer instantiated) 
config = await wcf_service.GetConfigAsync(user.ssid).ConfigureAwait(false); 

Wenn ich die Reihenfolge der Anrufe ändern, wie unten gezeigt, funktioniert wieder:

//Instantiate WCF Service 
WCFServiceProxy wcf_proxy = new WCFServiceProxy() 

//Call to WCF Service (works) 
config = await wcf_service.GetConfigAsync("2423432").ConfigureAwait(false); 

//Call to external REST Service (works) 
user = await m_http_client.GetProfileAsync(id).ConfigureAwait(false); 

Kann mir jemand helfen festzustellen, was hier vor sich geht? Das Problem tritt immer noch auf, wenn ich die ConfigureAwait-Werte auf true ändere, es handelt sich also nicht um ein Kontextwechselproblem.

Es gibt mehrere Web-API-Methoden innerhalb desselben Dienstes, die den obigen WCF-Proxy ohne Probleme aufrufen. Das Problem tritt nur auf, wenn ich einen externen Dienst vor dem Aufruf des WCF-Proxyobjekts aufruft.

Jede Hilfe und/oder Erkenntnisse würden sehr geschätzt werden.

Danke, Andrew

+0

können Sie den Stack-Trace buchen? –

+0

Haben Sie versucht, den HttpClient nach dem Aufruf des externen Dienstes zu entfernen? –

+0

Vielen Dank für die obigen Vorschläge, ich entsorge den HttpClient, es ist in einer "using" -Anweisung instanziiert und die Variable, die auf das instanziierte HttpClient-Objekt verweist, wird in meiner finally-Anweisung auf null gesetzt. –

Antwort

0

ich mein Problem endlich oben aufgelöst. Ich erhalte den ClientChannel von einer Eigenschaft namens InnerChannel, die Monitor.TryEnter verwendet, um sicherzustellen, dass die Erstellung des Kanals von einem einzelnen Thread ausgeführt wird. Bei der Erstellung dieser Sperre ist ein Problem aufgetreten, durch das InnerChannel nicht instanziiert wurde. Ich habe den kritischen Abschnitt des Monitor-Codes neu geschrieben, um das Problem zu lösen.

Vielen Dank für Ihre Unterstützung 1.618.

Andrew

Verwandte Themen