2
[ServiceContract]
public interface Service
{
   [OperationContract(IsOneWay = true)]
   void ServiceMethod();
}

IsOneWay = trueクライアントはサーバーの結果を気にせず、場合によってはサーバーのメソッドを長時間 (たとえば 30 分) 実行する必要があるため、サーバーのコードを で設定します。

しかし、クライアントはサーバーのメソッドが完了するのをまだ待っていることがわかりました。サーバーが 30 分で終了した後、クライアントは再度要求し、以下を報告しCommunicationExceptionます。

「ソケット接続が中止されました。これは、メッセージの処理中にエラーが発生したか、リモート ホストが受信タイムアウトを超えたか、基になるネットワーク リソースの問題が原因である可能性があります。ローカル ソケットのタイムアウトは '00:01:00' でした」.

クライアントはまだ結果を待っていると思います(デフォルトreceiveTimeOutは10分です)、その後タイムアウトにつながります。私はWCF3.0を使用しています。

手伝って頂けますか?ありがとうございました!

4

3 に答える 3

2

WCF の一方向呼び出しは、非同期呼び出しと同じではありません。

一方向の呼び出しを行っているクライアントがサービスからの応答を受信しない場合でも、受信したクライアント要求をディスパッチまたはキューに入れるために使用できるスレッドがサービスにない場合、ディスパッチャー スレッドが使用可能にならないと、クライアントはハングし、最終的にはタイムアウトになります。タイムアウト期間内。

使用可能なスレッドの数と要求キューのサイズは、WCF によって管理され、サービスの同時実行モード、セッション モード、およびサービスが信頼できるメッセージングで構成されているかどうかなどの要因によって決定されます。

于 2012-04-25T15:03:07.380 に答える
1

MSDN ServiceBehviorAttribute.concurrencyModeの状態:

ConcurrencyMode を Single に設定すると、サービスのインスタンスを一度に 1 つの実行スレッドに制限するようにシステムに指示します。これにより、スレッド化の問題に対処する必要がなくなります。

つまり、サービスのサーバー側のすべての呼び出しは、一意のスレッドで行われます。これは、マルチスレッドについて心配する必要がないという点で優れていますが、長い操作でその 1 つのスレッドをブロックすると、その処理中に発生するクライアントからの他の呼び出しが通過しないという点でもそれほど優れていません。したがって、例外です。

ConcurrancyMode = Single がデフォルトです。同時実行モードを複数に設定してみてください。これは、呼び出しがランダムなスレッドプール スレッドに着信し、そのうちの 1 つが要求の処理でビジー状態になっている場合、別の要求に別のスレッドを使用できることを意味します。しかし、現在環境がマルチスレッド化されているため、ロックまたはその他の同期メカニズムを使用して、複数のスレッドによるアクセスからサーバー オブジェクトを保護する必要があります。

于 2012-04-25T21:11:08.017 に答える
0

サービスクライアントの再生成を試みましたか? サーバーが一方向/非同期として再定義されているのに対し、クライアントはまだ同期操作への参照を持っている可能性があります。

于 2012-04-25T15:02:46.093 に答える