0

リモートマシンのWindowsサービス内で実行されているWCFサービスがあります。WCFサービスの契約では、実行に時間がかかるメソッドがあります。

[OperationContract(IsOneWay = true)]
void Update(myClass[] stuff);

すべてが正常に機能し、メソッドが呼び出されます。実行を開始するために必要なことを確認できます。

問題は、コード内のWCFサービスのインスタンスを閉じようとすると、タイムアウトになり、次のようになります。

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

片道契約で発砲して先に進むことができると思いました。足りないものはありますか?そうでない場合、これに対する回避策はありますか?

4

2 に答える 2

3

サービスのインターフェース定義のServiceContract属性は、デフォルトでSessionModeプロパティをSessionMode.Allowedに設定します。

[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface IMyContract
{
    [OperationContract(IsOneWay = true)]
    void Update(myClass[] stuff);
}

Juval LowyのプログラミングWCFサービスによると、

... SessionModeプロパティがSessionMode.Allowedで構成されている場合、トランスポートセッションを許可するだけで、強制はしません。結果として生じる正確な動作は、サービス構成と使用されるバインディングの結果です。

したがって、セキュリティまたは信頼性の高いメッセージングでWSHttpBinding、NetTcpBinding、またはNetNamedPipeBindingを使用している場合、サービスはセッションごとのサービスとして動作します。これは単に、クライアントプロキシが閉じられていない限り、サービスとクライアントの間でセッションが引き続き行われることを意味します。シラーズが提案したようにクライアントプロキシを閉じることで、これを修正する必要があります。

ジュヴァルの本はまた、一方向の操作に関してこれを述べています:

キューに入れられたメッセージの数がキューの容量を超えた場合、一方向の呼び出しを発行した場合でも、クライアントはブロックします。ただし、コールがキューに入れられると、クライアントはブロックが解除され、サービスがバックグラウンドで操作を処理している間、実行を継続できます。

したがって、一方向の操作ではファイアアンドフォーゲット操作が可能ですが、クライアントがブロックする可能性がある場合もあります。

于 2009-09-02T20:33:18.873 に答える
2

「更新」はサービスのメソッドです。

wcfクライアントを開くと、Close(またはAbort)を呼び出すまで、サービスへの接続は開いたままになります。

おそらくcloseを呼び出していないため、タイムアウトになるまで開いたままになります。

于 2009-09-02T20:08:50.403 に答える