WCFサービス、タイムアウトを増やす方法は?


93

ばかげた質問のように思えるかもしれませんが、WCFのすべてはasmxよりもはるかに複雑に見えますが、どうすればSVCサービスのタイムアウトを増やすことができますか?

ここに私がこれまでに持っているものがあります:

<bindings>
      <basicHttpBinding>
        <binding name="IncreasedTimeout" 
          openTimeout="12:00:00" 
          receiveTimeout="12:00:00" closeTimeout="12:00:00"
          sendTimeout="12:00:00">
        </binding>
      </basicHttpBinding>
</bindings>

そして、私のエンドポイントは次のようにマッピングされます:

<endpoint address="" 
  binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout"
             contract="ServiceLibrary.IDownloads">
             <identity>
                <dns value="localhost" />
             </identity>
          </endpoint>

私が得ている正確なエラー:

要求チャネルは、00:00:59.9990000の後の応答を待っている間にタイムアウトしました。Requestの呼び出しに渡されるタイムアウト値を増やすか、BindingのSendTimeout値を増やします。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。

WCFテストクライアントには、サービスのランタイム構成を含む構成アイコンがあります。

ご覧のとおり、設定した値と同じではありませんか?何が悪いのですか?

<bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IDownloads" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="">
                            <extendedProtectionPolicy policyEnforcement="Never" />
                        </transport>
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>

回答:


179

バインディング構成には、調整可能な4つのタイムアウト値があります。

<bindings>
  <basicHttpBinding>
    <binding name="IncreasedTimeout"
             sendTimeout="00:25:00">
    </binding>
  </basicHttpBinding>

最も重要なのは、sendTimeoutクライアントがWCFサービスからの応答を待機する時間を示すです。あなたはhours:minutes:secondsあなたの設定で指定することができます-私のサンプルでは、​​タイムアウトを25分に設定しました。

openTimeout名前が示すようにすることはあなたがあなたのWCFサービスへの接続を開くときに待って喜んでいる時間の量です。同様に、closeTimeoutは、接続を閉じる(クライアントプロキシを破棄する)ときに、例外がスローされるまで待機する時間です。

これreceiveTimeoutは、ミラーのようなものsendTimeoutです。送信タイムアウトは、サーバーからの応答を待つreceiveTimeout時間ですが、クライアントは、サーバーからの応答を受信して​​処理する時間です。サーバ。

「通常の」メッセージをやり取りしている場合は、どちらもかなり短くなる可能性があります。特に、receiveTimeoutSOAPメッセージの受信、復号化、チェック、およびデシリアライズにほとんど時間がかからないためです。ストーリーはストリーミングとは異なります。その場合、サーバーから返されるストリームの「ダウンロード」を実際に完了するには、クライアントでさらに時間が必要になる場合があります。

openTimeout、receiveTimeout、およびcloseTimeoutもあります。バインディングのMSDNドキュメントは、あなたにこれらのためにあるものについてより多くの情報を提供します。

WCFのすべての複雑さを真剣に把握するには、ミシェルルルーブスタマンテの「Learning WCF」を購入することを強くお勧めします。

WCFの学習http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

また、彼女の15部構成の「WCFトップからボトム」のスクリーンキャストシリーズの視聴にも時間を費やしています。

より高度なトピックについては、Juwal LowyのプログラミングWCFサービスブックを確認することをお勧めします。

WCFのプログラミングhttp://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg


バインディングセクションをweb.configの<system.serviceModel>に追加しようとしましたが、エラーがスローされます...見逃していた追加の手順があります...
JL。

また、サービスのエンドポイントを<endpoint address = "" binding = "IncreasedTimeout"に変更しました-これは間違っていることですか?
JL。

私はそれを理解していると思います-binding = "basicHttpBinding" bindingConfiguration = "IncreasedTimeout"
JL。

まさに-バインディングは、使用するプロトコルのタイプです-basicHttp、wsHttp、netTcp。バインディング構成は、タイムアウトなどを変更するために構成で作成するこの構成です
marc_s

これを行ってもなおタイムアウトエラーが発生するので、Marcはできるだけ多くの情報を提供できますか?
JL。

27

最善の方法は、コードで必要な設定を変更することです。

以下の例を確認してください。

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);
}

これは、構成を更新するよりも優れたソリューションです。これにより、さまざまな呼び出しやサービスに異なる値を構成できるようになりました。多くの感謝
Salim

26

タイムアウト構成はクライアントレベルで設定する必要があるため、web.configで設定していた構成は効果がなく、WCFテストツールには独自の構成があり、タイムアウトを設定する必要がある場所があります。


1
ええ、そうです-通常、それはクライアントとサーバーの両方で設定する必要があります-たとえば、セッションでの "inactivityTimeout"の場合など。
marc_s

8
JL:あなたが何をしたかを示すことができますか?私は同じ問題を抱えています
ニック・カーン

「WCFテストクライアント」を使用している場合は、サービスツリーの「構成ファイル」を右クリックし、「SvcConfigEditorで編集」をクリックして、バインディング内のタイムアウトを変更します。
Radderz、

4

最近同じエラーが発生しましたが、すべてのwcfクライアント呼び出しを確実に閉じることで修正できました。例えば。

WCFServiceClient client = new WCFServiceClient ();
//More codes here
// Always close the client.
client.Close();

または

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    //More codes here 
}

10
'using'アプローチは使用しないでください:omaralzabir.com/do-not-use-using-in-wcf-client
Alex Marshall

omaralzabir.com/do-not-use-using-in-wcf-clientのコメントにはusing、障害のあるチャネルオブジェクトを破棄せずに引き続き使用する方法の例があります。usingブロックとの互換性が高いアプローチを持つ別のブロガーは、次のとおりです: erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper
グレッグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.