2012-05-02 7 views
2

多分私はWCFを不適切に実装していますが、多数の呼び出しを行った後にを使用しているときにWCF例外が発生しているようです。複数の呼び出しの後にWCFでTimeoutExceptionが発生する

ここは私がやっていることの高レベルです。基本的には、私はproc exeで作業していて、WCFという名前のパイプを使って前後に通信しています。私は、この属性を経由して私のホストが開いたまま:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
    ConcurrencyMode = ConcurrencyMode.Multiple)] 

その後、私のクライアントで私は一度インスタンス化し、必要に応じて経由で使用static DuplexChannelFactory作成:私はちょうどのPingメソッドを追加した

channelFactory.CreateChannel().MakeCall(); 

をホストが正常に動作していることを確認します(ホストは知らないうちに見逃したくないイベントを返送するため)。このPingメソッドは5秒ごとに1回実行され、単にtrueを返します。しかし、2,3分実行した後、私はTimeoutExceptionを取得します。ここに私の例外トレースは次のとおりです。

サーバースタックトレース: で System.ServiceModel.Channels.CommunicationObject.Open(TimeSpanの タイムアウト)で System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpanの タイムアウト)で System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannelでSystem.ServiceModel.Channels.ServiceChannel.OnOpen(のTimeSpanタイムアウト)System.ServiceModel.Channels.CommunicationObject.Open(のTimeSpan タイムアウト)で
。 ICallOnce.Call(ServiceChannel チャネル、 System.ServiceModel.Channels.ServiceChannel.Callで System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpanの タイムアウト)で System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpanの タイムアウト、CallOnceManagerカスケード)でのTimeSpanタイムアウト) にSystem.ServiceModel.Channels.ServiceChannel.Call(String action、 ブール一行、ProxyOperationRuntime操作、Object [] ins、 オブジェクト[]アウト、TimeSpanタイムアウト)オブジェクト[]) にSystem.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime操作しかし、私はしません

connection = this.connectionPoolHelper.EstablishConnection(timeout) 

:) System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessageが メッセージ)

で私はJustDecompileを開いていて、このエラーはほとんどの場合、ここで起こっていることを確認します以前に数回pingしてからタイムアウトになる理由を見てください。この設定を無限にするために設定する必要があるのは、クライアントまたはサーバー側からこのWCFイベントサーバー(オンデマンド処理にも使用されます)を実装する別の方法ですか?

UPDATE

私はコール試行、ノーリターンを見始める前に、私は約6 pingを作ります。

+2

_これまで何時間も働いた後にタイムアウトする理由はありませんか?_ - 実際には多くの意味があり、リソースリークとしてマークしています。あなたは何かを閉じたり/取り除いたりしていません。 –

+0

@HenkHoltermanでも、サーバーやクライアントには何がありますか?私はCreateChannelを何回も呼び出さないのですか?たぶんCreateChannelとそれを何度も何度も使っていますか?私の推測では、クライアントをどこかに置いておくことです。なぜなら、サーバーを保持してクライアントを強制終了することができ、クライアントの再起動時に少しでも機能するからです。 –

+0

うーん、6ピングは半分です。数分ではありません。 –

答えて

2

問題は、CreateChannelを何度も呼び出すことができないということでした。これは私のWCFインターフェイスの単なるプロキシなので、disposeメソッドはありません。だから、私はちょうどプロキシへの参照を格納し、ホストの再インスタンス化が必要な場合はそれを再作成することでこれを解決しました。

これについてのドキュメントがあると思います。特に、CreateChannelを何回か呼び出す場所に書かれたブログがある場合は役に立ちません。

UPDATE:

Here is what I found as to how this should be solved...although it did not work for me.., but seems to for others

スニップコードリンクが死んだ場合:

あなたはそれがIClientChannelにキャスト使用して使用して、使用中にあなたの参照をリセットする必要があります。チャンネルは正常に閉じられますが、参照は開いたままです。

using (IClientChannel client = (IClientChannel)channelFactory.CreateChannel()) 
{ 
    var proxy = (IMyInterface)client; 
} 
+0

チャネルリファレンスをIClientChannelにキャストするか、直接IDisposableにキャストすることができます。それでは、を使用してください。 –

+0

私はそれを試さなければなりませんが、もし私がそれをすれば私はクラスメソッドを使うことができますか? –

関連する問題