0

私のアプリケーションでは、同期中の Winform UI スレッドが WCF メソッドを呼び出します。99.99% の場合は問題ありませんが、WCF メソッドの呼び出しがロックされ、UI がフリーズすることがあります。

呼び出しを非同期にすることで 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>
4

1 に答える 1

2

WCF サービスのハングの問題のほとんどは、WCF クライアント プロキシの破棄に関連しています。これは、あなたの場合の問題だと思います。クライアント プロキシを正しく破棄しないと、(maxConcurrentSessions + 1) 回目の呼び出しを行うときにタイムアウト例外が発生します。

この記事をチェックしてください。

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

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

于 2011-07-15T18:46:23.567 に答える