2

WCF サービスに次のコードがあり、basicHttpBindingを使用しています

public class Service1 : IService1
{
        public string GetData(int value)
        {
            // Sleep for a minute
            System.Threading.Thread.Sleep(60000);
            return string.Format("You entered: {0}", value);
        }
}



クライアントに次のコードがあり、クライアントの「sendTimeout」はわずか1秒です(サーバーが応答する前にクライアントをタイムアウトさせたい)

Service1Client clientProxy = new Service1Client();
        try
        {

            Console.WriteLine(clientProxy.GetData(10));
            clientProxy.Close();
        }            
        catch (TimeoutException)
        {
            if (((ICommunicationObject)clientProxy).State == CommunicationState.Opened)
            {
                // In the case of TimeoutException the state is not faulted and 
                // "close" is invoked
                clientProxy.Close();
            }
        }        



要求の IIS ログに表示される内容は次のとおりです。

2012-09-07 07:22:51::1 ポスト/SimpleTimeWCF/Service1.svc - 80 - ::1 - 200 0 64 60015

ステータスが 200、sc-win32-status が 64、所要時間が 60015 (約 1 分) であることを確認できます。

WCF サービスが要求の処理でビジー状態である間に、クライアントが clientProxy.Close を呼び出しました。サーバー上で予想される動作は何ですか?

basicHttpBinding を使用する場合、サーバーでの「クライアント プロキシ クローズ」メソッド呼び出しの予想される動作は何ですか?

他のバインディングを使用すると動作が変わりますか? 例: ネット TCP バインディング? net tcp バインディングを使用すると、サーバーとの "tcp 接続" が確立された後、プロキシで "close" が呼び出されますか?

PS: IIS で HTTP キープアライブを有効にするを false に設定したことに注意してください。

4

1 に答える 1

1

サービスはクライアントからのリクエストを取得します。リクエストの処理には 60 秒かかります。クライアントはその間に「あきらめ」ましたが、HTTP では、以前の要求がもう必要ないことをサービスに通知する方法がありません。

最後に、サービス:

于 2012-09-07T10:04:09.903 に答える