インスタンスコンテキストモードをPerCallに設定し、wsHttpBindingを使用してWCFサービスを取得しました。正しくコーディングされていないクライアントは、セッションを適切に解放せずにセッションを消費することができます(つまり、クライアントはクライアントプロキシでClose()を呼び出さない)。 "最大同時セッション数"パフォーマンスカウンターを見ると、各接続がセッションを使い果たしていることがわかります。セッションを解放しません。通常の正常な状況下では、呼び出しの結果が返されている間だけセッションが数分間使用されます。WCF:コールごとのセッションタイムアウト
私は、これらの悪いセッションをタイムアウトさせて消え去る方法を見つけようとしていますが、失敗しています。これは信頼できるセッションではないため、RecieveTimeoutとInactivityTimeoutの設定は効果がないようです。ここではそれに設定されたタイムアウトの数を持っている私の現在の設定の一部ですが、動作していないよう:
<behaviors>
<serviceBehaviors>
<behavior name="UpdaterBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="MembershipProvider"/>
<serviceCertificate findValue="xxxxxx" x509FindType="FindBySubjectName"/>
</serviceCredentials>
<serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="SqlRoleProvider"/>
<serviceThrottling maxConcurrentCalls="10" maxConcurrentSessions="10" maxConcurrentInstances="10" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="UpdaterBinding" messageEncoding="Mtom" maxReceivedMessageSize="100000000" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:01:00" sendTimeout="00:01:00">
<reliableSession ordered="true" inactivityTimeout="00:01:00"
enabled="false" />
<readerQuotas maxArrayLength="100000000"/>
<security>
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
私ははるかに高いserviceThrottling番号を設定することができますが、それだけでしばらくの間、問題を隠し最終的に悪いクライアントはすべてのセッションを使います。私は、このサービスではそれほど長い時間がかかる理由はないので、サーバーは数分以上経過しているセッションを解放することを望みます。
提案がありますか?
これについてさらに調査する必要がありますが、外部でサービスを再開することは選択肢ではありません。サービスは現在、小さなexe(IISではなく)の内部でホストされています。 –
すべてのセッションを終了する必要はないが、ウィンドウ内で実行されているサービスを再開できるので、オプションではないかどうかはわかりません。 http://www.csharp-examples.net/restart-windows-service/ – evasilchenko
申し訳ありませんが、明確にするために:このようなコーナーケースを処理するサービス全体を引き受けることは、私がやりたいことではありません。サービスへの定期的な中断のコストは、これがこれまでに問題になる可能性よりはるかに高いです。 –