.Net WCFサービスで次の例外が断続的に発生します。 「 http://MyServer/TestWCF/MyService.svc にあるHTTPサービスがビジー状態です。」
ここで何か不足していますか?
基本的なhttpバインディングを使用しており、WCFスロットリングを有効にしています。
<basicHttpBinding>
<binding name="BasicHttpBinding_MyService" maxReceivedMessageSize="2147483647"
messageEncoding="Text" textEncoding="utf-16" sendTimeout="00:01:00" >
<readerQuotas maxStringContentLength="2147483647" maxArrayLength="163840000"
maxDepth="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="16384" />
</binding>
。 。 。 。
<behavior name="MyWCFServices.MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceThrottling
maxConcurrentCalls="16"
maxConcurrentInstances="2147483647"
maxConcurrentSessions="10"/>
</behavior>
スロットルは問題の解決に役立ちますか?また、トラフィックの多いWebサイトのスロットリングに推奨されるパラメーター値を知っていますか?
サービススロットリング動作のmaxConcurrentSessions
とmaxConcurrentCalls
を標準値の30程度に増やして、エラーがなくなるかどうかを確認してみてください。サーバーがビジー状態であることは、サービススロットリング動作で許可されている領域よりも多くのリクエストが受信されたことを示しているようで、指定されたタイムアウト期間内にサービスを提供できるサービスインスタンスがなくなったため、リクエストは破棄されました。
私の答えは、アプリプールが稼働しているかどうかを確認することですか?
キャッチされない例外がスローされたためにアプリプールが停止したときに、このエラーが発生するのを見てきました。
たとえば、カスタム構成セクションを検討してください。そこにエラーがあると、アプリが起動する前に失敗します。短期間でこれらが多すぎると、アプリプールが停止します。
アカウント(ID)でサービスを実行している場合は、最近パスワードを変更した可能性があります。IIS Advancedのアプリケーションプールのパスワードをリセットする必要があります。 [設定] | [ID]ダイアログボックス。
これは、maxConcurrentSessionsだけでなく、セッションの継続時間でもあります。
クライアントが接続を閉じない場合、タイムアウトになるまで開いたままになります。その後、サーバーでのアクティビティがほとんどない状態でmaxConcurrentSessions制限に達する可能性があります。
内部例外も確認してください。展開中は、WCF Webサービスのアプリケーションプールを無効にします。その間、クライアントはこのエラーを受け取り始めます。
System.ServiceModel.ServerTooBusyException: https://ourserver.x.com/path/service.svc にあるHTTPサービスがビジーです。 ---> System.Net.WebException:リモートサーバーがエラーを返しました:(503)サーバーを使用できません。
したがって、この場合、HTTPエラー503は「サーバーがビジー状態」であると(誤解)解釈されます。
私はこのエラーに出くわしました、そして単純な設定の問題に要約されました。まったく同じポートと同じインターフェースでサービスを稼働させました(模擬サービス)。適切なコマンドラインスイッチを使用してサービスを実行し、意図した「元の」サービスを実行しました。エラーはなくなりました。
私が認識しているこの例外の唯一の原因は、セッションを使用していて、MaxPendingChannelsスロットルを何とかヒットした場合です。デフォルトは4のようにかなり低くなっています。これを高く設定して(たとえば128)、再現する場合は1に設定すると、負荷テストで確認できます。
セッションの詳細については、こちらをご覧ください: http://msdn.Microsoft.com/en-us/library/ms733795.aspx
私の解決策は、App.Configファイルをチェックし、この特定のサービスのサービスタグが存在するかどうかを確認することです。
例えば:
<service name="MyServices.ServiceName">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="TestBinding" contract="MyServices.ServiceName">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<Host>
<baseAddresses>
<add baseAddress="http://localhost:8732/Design_Time_Addresses/MyServices/ServiceName/" />
</baseAddresses>
</Host>
</service>