.Net 3.5 を使用して、IIS Express (最終的には完全な IIS) でホストされているかなり単純な WCF Web サービスがあります。service メソッドはかなり面白くありません。
[ServiceContract]
public class MySvc
{
[OperationContract]
public Stuff MyMethod(string input)
{
Stuff result = DoSomething();
return result;
}
}
サービス構成もかなり一般的です。
<system.serviceModel>
<services>
<service behaviorConfiguration="MySvcBehavior" name="MySvc">
<endpoint address="" binding="wsHttpBinding" contract="MySvc">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MySvcBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
サービスは、ASPX アプリケーションのコード ビハインドによって使用されます。サービス参照があり、同様に興味深いコードがいくつかあります。
MySvcClient svc = new MySvcClient();
Stuff result = svc.MyMethod("foo");
一度に 1 つの要求である限り、すべてが正常に機能し、クライアント コードは期待される結果を取得します。わーい。
問題は、非常に原始的なストレス テストを行ったときに発生します。クライアントの ASPX ページをブラウザーに読み込み、F5 キーを押したままにします。IIS Express ウィンドウを見ると、最初は結果がステータス 200 として返されますが、数分後にステータス 500 が表示され始めます。この時点で、IIS Express を再起動するまで、サービスはステータス 500 でのみ応答します。(10分程度の待ち時間が目安です。)
クライアント コードにブレークポイントを設定すると、「サーバー上で保留中の安全な会話が多すぎます。後で再試行してください」という完全な戻りメッセージが表示されます。
サーバー コードにブレークポイントを設定すると、コードが呼び出されていないことがわかります。そのため、呼び出しとコードの実際の開始の間のどこかで失敗しています。
私のオンライン検索はあまり有望ではありませんでした.maxPendingSessionsプロパティをオーバーライドするためにカスタムバインディングを作成するという同じ提案と、「[名前のない]構成ファイル設定があると誰かが私に言った」で始まるスレッドにつながりました。 Microsoft がこれをバグとして認識していると主張する壊れたリンク。
maxPendingSessions プロパティに関するリンクには、タイムアウトが 2 分の 128 接続の制限が記載されており、私のテスト方法が一部の接続を中断する場所を確実に確認できます。これは、明らかに悪いテスト方法論の予想される結果ですか? または、これを改善するために構成で何かを行うことができますか?