2016-05-05 18 views
4

HttpClientを使用して外部REST APIサービスを呼び出すWeb APIコントローラメソッドがあります。外部REST呼び出しの結果は、そのプロキシへの呼び出しを介してWCFサービスに渡されます。外部API呼び出し後にWCFプロキシが失敗する

最初にWCFプロキシを呼び出してから、外部RESTサービスを呼び出すと、すべて正常に動作します。呼び出しの順序を逆にすると、プロキシのInnerChannel(m_inner_channel = m_channel_factory.CreateChannel())がnullであるため、WCFプロキシ呼び出しが失敗します。ここ

は、例示目的のための例示である:

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

作品上記のコード、私が実装する場合、私が作るしかしWCFプロキシのInnerChannel(m_inner_channel = m_channel_factory.CreateChannel())以下のコードがnullサービスへの呼び出し:

//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); 

それが再び動作する以下のように私は、呼び出しの順序を変更する場合:

//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); 

誰も私がここで何が起こっているのか判断するのを助けることができますか? ConfigureAwaitの値をtrueに変更してもコンテキストの切り替えの問題ではないので、この問題は引き続き発生します。

上記のWCFプロキシを何も問題なく呼び出す同じサービス内にいくつかのWeb APIメソッドがありますが、この問題はWCFプロキシオブジェクトを呼び出す前に外部サービスを呼び出すときにのみ発生します。

ご意見やご感想をいただければ幸いです。

は私が最終的に上記の私の問題を解決し、 アンドリュー

+0

スタックトレースを投稿できますか? –

+0

あなたは外部サービスを呼び出した後にHttpClientを廃棄しようとしましたか? –

+0

上記の提案をいただきありがとうございます。私はHttpClientを破棄しています。これは "using"ステートメントでインスタンス化されており、インスタンス化されたHttpClientオブジェクトを参照する変数はfinallyステートメントでnullに設定されています。 –

答えて

0

、ありがとうございました。 InnerChannelという名前のプロパティからClientChannelを取得します.InterChannelは、Monitor.TryEnterを使用してチャネルの作成が単一のスレッドによって確実に行われるようにします。このロックの作成に問題があり、InnerChannelがインスタンス化されませんでした。問題を解決するためにMonitorコードのクリティカルセクションを書き直しました。

ありがとうございました。

アンドリュー

関連する問題