2011-07-15 6 views
0

私のアプリケーションではWinform UIスレッドが同期してWCFメソッドを呼び出します。 これは99.99%の時間ですが、WCFメソッドの呼び出しがロックされ、UIがフリーズします。WCFサービスはどのようにロックされますか?

私は、非同期呼び出しを行うことでUIのフリーズを防ぐことができます - 私たちのWCF呼び出しのほとんどは非同期ですが、この特定の小さなメソッドを同期させることはそれほど悪くないと考えました。

WCFサービスのロックが発生すると、ほかのユーザーもサービスにアクセスできなくなります。この問題を解決するには、WCFサービスホスト(Windowsサービス)を再起動する必要があります。

WCFサービスがどのようにロックされ、アクセス不能になる可能性がありますか?
シナリオは考えられません。
通常どおり実行されていたデータベースを確認しました。

技術的な内容: サービス代理店でプロキシを使用しています。プロキシを持つこのサービスエージェントは、アプリケーションの実行中も有効です。

[PreserveReferences] 
[OperationContract(IsOneWay = false, AsyncPattern = false, Action = "MyMethod")] 
     MyType MyMethod(); 

使用中のバインディング:

<wsHttpBinding> 
     <binding name="AppWsHttpBindingConfig" transactionFlow="true" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Mtom"> 
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
      <reliableSession ordered="false" enabled="false" /> 
      <security mode="Message"> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
+0

これを明確にするために、あなた自身があなたのWCFサービスをホストしていますか? –

+0

あなたはどのようなバインディングを持っていますか? wsHttp、nettcp ??? –

+0

@ジョナサン私たちは、サーバー上のメソッドを呼び出すWinformクライアントを持っています。 WCFサービスはこのサーバー上のWindowsサービスでホストされます。 – Gerard

答えて

2

WCFサービスのほとんどは問題をハング私はあなたのケースでは問題であると考えてWCFクライアントプロキシの処分に関連しています。クライアントプロキシを正しく処理しない場合は、(maxConcurrentSessions + 1)番目の呼び出しを行うときにタイムアウト例外が発生します。

thisの記事をご覧ください。

あなたのチャンネルがフォールト状態でない場合、そのチャンネルのAbortを呼び出すと、クライアントリソースは解放されますが、サーバーリソースは解放されません。たとえば、サービスメソッドがFaultExceptionをスローした場合、チャネルはフォルト状態になりません。したがって、このプロキシでabortを呼び出すと、クライアントのないサーバでセッションが開かれます。

これはあなたのケースであるかどうかにかかわらず、その記事に記載されているアプローチを使用するか、同じアイディアを持つ他の方法を検討する必要があります。

+0

これは有望に見えますが、私はwsHttpBindingがセッションを使用することを認識しませんでした。 establishSecurityContext = "false"を使うのはどうですか? – Gerard

+1

@ジェラード私はそれがあなたのサービスの性質とアプリケーションを消費しているかどうかにかかっていると思います。あなたのクライアントが連続してたくさんの呼び出しを行うか、多くの要求によってサービスがヒットした場合、これをfalseに設定すると、パフォーマンスが低下します。そして、私は実際にこの種の認証がパフォーマンスの観点からは最高ではないと推測しています。 :) –

関連する問題