2012-03-06 20 views
3

インスタンスコンテキストモードを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番号を設定することができますが、それだけでしばらくの間、問題を隠し最終的に悪いクライアントはすべてのセッションを使います。私は、このサービスではそれほど長い時間がかかる理由はないので、サーバーは数分以上経過しているセッションを解放することを望みます。

提案がありますか?

答えて

1

オーケー、私は完全にオフベースここかもしれないが、私はあなたの質問からわかる内容に基づいて、ここでの可能な解決策は、次のとおりです。

どうやらあなたはアクティブなセッションのリストを取得することができますが、あなたがセッションを終了することはできませんサービス側から:IISでWCFサービスをホストしている場合、私は考えることができる

http://social.msdn.microsoft.com/Forums/en/wcf/thread/a6a72bd7-bd06-43e3-8abb-d6c10432a07b

一つである、あなたは、サーバー上で実行されていると、アクティブなセッションを見ているWindowsサービスを作成することができます。セッションの構築がサーバーの管理が難しい場合に、IISアプリケーションプールを強制的に再起動することができますか?孤立したセッションへ

Restarting (Recycling) an Application Pool

+0

これについてさらに調査する必要がありますが、外部でサービスを再開することは選択肢ではありません。サービスは現在、小さなexe(IISではなく)の内部でホストされています。 –

+0

すべてのセッションを終了する必要はないが、ウィンドウ内で実行されているサービスを再開できるので、オプションではないかどうかはわかりません。 http://www.csharp-examples.net/restart-windows-service/ – evasilchenko

+0

申し訳ありませんが、明確にするために:このようなコーナーケースを処理するサービス全体を引き受けることは、私がやりたいことではありません。サービスへの定期的な中断のコストは、これがこれまでに問題になる可能性よりはるかに高いです。 –

1

一つのオプション(そのようなサービスは、現在設定されている方法である信頼性の高いメッセージングなど)のセッションに依存する機能を使用しないようにwsHttpBindingを設定することです。

信頼性の高いメッセージングが必要なビジネスニーズがある場合は、メッセージの配信を保証するためにnetMsmqBindingに行きますが、一方向のメッセージングパターンを念頭に置いて設計してください。 DeviantSeevは、サービスからのセッションの終了を制御することはできませんが、彼が推奨するソリューションはかなり劇的です。あなたがアプリケーションプールをリサイクルすることによって引き起こされるダウンタイムのために、電子商取引サイトのような大量の環境を持っているなら、実際には実現可能ではありません。

+0

私はそれが信頼性の高いメッセージングのために構成されているとは思っていません(enabled = "false"に注意してください)。信頼性の高いメッセージングを無効にするために必要なことが他にもある場合、私はそれを認識していません。 –

+0

'enabled =" false "'が欠落して申し訳ありません、私は 'ordered =" true "'部分に焦点を当てました。テストとして、この[forum post](http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/271b1816-173c-4c76-a4c4-fd9fda4b5e91)に示すようにセキュリティを無効にしてみてください設定からreliableSession要素を削除します。その構成が孤立したセッションの問題に役立つかどうかを確認してください。そうであれば、セキュリティを回復し、問題が戻ってくるかどうか確認してください。セキュリティが原因である場合、それを無効にすることが本当にあなたの状況の解決策であるかどうかを判断する必要があります。 –

+0

私は余裕を持っていれば、助けてくれるかどうか試してみるかもしれません。たとえそれが残っていても、残念なことにセキュリティをオフにすることは実際の選択肢ではありません。 –

関連する問題