33

WCF を使用して Web サーバーと通信する小さなアプリケーションがあります。このプログラムは約 200 のクライアントで使用されており、各クライアントは 1 分あたり約 5 ~ 20 のリクエストを送信しています。

私がよく得るエラーログを見ると:

00:00:59.9989999 の後に応答を待っている間にリクエスト チャネルがタイムアウトしました

リクエストは次のように行われます。

ClientService Client = new ClientService();
Client.Open();
Client.updateOnline(userID);
Client.Close();

これはapp.configです

<configuration>
<configSections>
</configSections>
<startup><supportedRuntime version="v2.0.50727"/></startup><system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_IClientService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                allowCookies="false">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <reliableSession ordered="true" inactivityTimeout="00:10:00"
                    enabled="false" />
                <security mode="None">
                    <transport clientCredentialType="Windows" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="Windows" negotiateServiceCredential="true" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="PATH TO SERVICE"
            binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IClientService"
            contract="IClientService" name="WSHttpBinding_IClientService">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

毎日の「多くの呼び出し」のうち、約 200 ~ 800 件が失敗します。そして約n-1は大丈夫です。何が問題なのか非常に混乱しています。サーバーの統計を見ると、ほとんど汗をかきません。各リクエストの処理には 2 秒未満かかります。送信しているデータは「int」または「非常に小さな文字列」で構成されているため、サイズが原因ではない場合、一貫したエラーが発生するはずです..

提案?

4

3 に答える 3

13

リクエストが処理される前にサーバーでキューに入れられ、タイムアウトが発生しているようです。ここでいくつかのことを試して、何が起こっているかを正確に確認できます

1) WCF サービスでスロットリングを試してください。例: 同時セッションを増やしてみてください。WCFスロットリングを見てください

2) ここでセッションを使用するのではなく、PerCall を使用して、セッションが残っていないことを確認してください。セッションを削除するためにインターフェースでできることは次のとおりです

[ServiceContract(Namespace="YOUR NAMESPACE", SessionMode=SessionMode.NotAllowed)]

およびそれらのインターフェイスを実装するコントラクト クラス

ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

そして ....何が起こっているのかを正確に確認するには、トレースを有効にする必要があります。

于 2012-06-26T21:34:44.873 に答える
4

このパフォーマンス カウンターを確認してください - ASP.NET Requests Queued

1 つの Web アプリケーションで、多数の Web ページとサービスをホストできます。IIS は、既定では CPU コアあたり 12 の同時要求のみを処理します。

これは、サービスが高速であっても、他のページ/サービスが低速であっても、リクエストが実行される前にキューで待機する必要があることを意味します。

ASP.NET Requests Queuedゼロまたはゼロに近い必要があります。

MSDN の ASP.NET のパフォーマンス カウンターを参照してください。

于 2012-06-26T21:28:30.667 に答える