2

OneWayとして定義されているサービスをフォローしています。これは、実行時間が長く(数分)、終了するのが待ちきれないためです(ASP.NETアプリケーションで使用されています)。

問題は、サービス呼び出しの後にclient.Dispose()を呼び出すと、それがブロックされ、60秒後に例外を除いてタイムアウトが期限切れになることです。

そのようなシナリオでクライアントをどのように処分する必要がありますか?サービスのタイムアウトを増やすことは解決策ではありません。なぜなら、それが使用されているWebページのHTTPリクエストを長時間待つことができないからです。

[ServiceContract]
public interface IMyService
{        
    [OperationContract(IsOneWay = true)]
    void BeginRun();
}

var client = new MyServiceClient();
client.BeginRun();
client.Close(); //This leads to time-out, how and when to call it?

ヒントをありがとう。

4

4 に答える 4

3

バインディングをnetMsmqBindingに切り替えます。次に、クライアントからの片道通話が瞬時に行われます。

httpを介した長時間の送信は、せいぜい問題があり、管理が複雑です。間にキューを置くと、この操作が大幅に簡素化されます。

于 2012-12-18T08:38:43.637 に答える
2

あなたの署名から、あなたはどんな種類の応答も必要としないようです。その場合、サービス上で、BeginRun()呼び出しを受信したときに、非WCFスレッドで作業を実行します。これによりチャネルが解放され、クライアントをすぐに破棄できるようになります。

としてマークを付けたOperationContractとしてもIsOneWay、それはWCFがすぐにチャンネルを解放するという意味ではありません。WCFサービスは、すべてのデータがネットワークから読み取られるまで、実際には一方向の呼び出しから戻ることはありません。サービス構成によっては、これには以前の呼び出しが完了するのを待つことが含まれる場合があります(特に、単一同時実行モードのセッションフルサービス構成の場合)。

したがって、いくつかの理由から、WCFスレッドとは別のスレッドで実際にサービス作業を実行することをお勧めします。これにより、スループットが向上します。詳細については、MSDNのこの記事を参照してください。

于 2012-12-17T18:06:26.917 に答える
0

IChannelアプローチを試すことができます。または、これを試してみてください。これが機能するかどうかはわかりません:http: //msdn.microsoft.com/en-us/library/ms731177.aspx

于 2012-12-17T18:09:13.853 に答える
0

コード内にtrycatchブロックを追加する必要があり、タイムアウト例外がある場合はクライアントを中止する必要があります。

        try
        {
            work(client);
            client.Close();
        }

        catch (Exception e)
        {
            client.Abort();
            throw;
        }
于 2012-12-17T18:43:08.383 に答える