3

魔法の 10 プロキシのインスタンス化の後にハングする二重 WCF サービスがあります。クライアントの特定のエラーは次のとおりです。

「System.TimeoutException: この要求操作は net.tcp://localhost:8080/RoomService/netTcp に送信され、構成されたタイムアウト (00:00:59.9960000) 内に応答を受け取りませんでした」。

サーバーに明らかなエラー メッセージはありません。

次のインスタンスを開く前に、プロキシ接続のすべてのインスタンスを適切に閉じているため、これは標準的な明らかな問題、つまりプロキシ接続を閉じることができないことに注意してください。

try
{
    client.Close();
}
catch (CommunicationException)
{
    client.Abort();
}
catch (TimeoutException)
{
    client.Abort();
}
catch (Exception)
{
    client.Abort();
    throw;
}

そして、スロットリング動作をすべて同時に 500 に設定しました。

ServiceThrottlingBehavior throttlingBehavior = new ServiceThrottlingBehavior()
{
    MaxConcurrentCalls = 500,
    MaxConcurrentSessions = 500,
    MaxConcurrentInstances = 500
};

サービスの ConcurrencyMode を Multiple に設定し、InstanceContextMode の 3 つの可能な値すべてを試しました。

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]

サービスを自己ホストし、IIS 内でホストしようとしましたが、それぞれで同じ結果が得られました。

NetTcpBinding、WSDualHttpBinding、および PollingDuplexBinding (Silverlight 上) を試しましたが、それぞれで同じ結果が得られました。これは双方向サービスであるため、BasicHttpBinding または WSHttpBinding を試すことができません。

私のコードには、(複数のコールバックを同時に実行するために) 複数のスレッドを起動している場所が 1 箇所ありましたが、トラブルシューティングの目的でその部分を少しコメントアウトしましたが、違いはありませんでした。

クライアントでは、テストごとに新しいプロキシを使用し、すべてのテストで同じプロキシを再利用しようとしましたが、うまくいきませんでした。プロキシごとに新しい InstanceContext を作成し、すべてのプロキシで同じ InstanceContext を再利用しようとしましたが、うまくいきませんでした。

何をしても、テスト ハーネスで 10 回目のテストを実行した後、サービスへの次の呼び出しがハングします。

私が間違っているかもしれないことについて何か考えはありますか?

4

5 に答える 5

0

答えはありませんが、デバッグに関するアドバイスはあります。

1)Visual Studioデバッガーをサービスプロセスに接続し、何が起こっているかをキャッチできるかどうかを確認します。

2)例外情報をクライアントに返すようにサービスの動作を構成し、サービスが報告されていない例外をスローしているかどうかを確認します。

<behaviors>
    <serviceBehaviors>
        <behavior name="ServiceBehavior">
            <serviceDebug includeExceptionDetailInFaults="True"/>
        </behavior>
    </serviceBehaviors>
</behaviors>

3)ActivityTracingを有効にしてサービスロギングをオンにし、Service Trace Viewer(Windows SDKから)を使用してログを分析し、何かがポップアップするかどうかを確認します

<system.diagnostics>
    <trace autoflush="true" />
    <sources>
        <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
            <listeners>
                <add name="sdt" type="System.Diagnostics.XmlWriterTraceListener" initializeData="Service.svclog"  />
            </listeners>
        </source>
    </sources>
</system.diagnostics>

4)サービスラッパーを機能コードから分離し、サービスがまだハングするかどうかを確認します。そうでない場合は、何が原因でハングしているのかがわかるまで、機能を段階的に追加し直します。

5)HTTPバインディングを使用している場合は、フィドラーでサービスをプロキシし、httpトラフィックをログに記録します。

6)マネージドWindowsサービスでWCFサービスをホストし、起動後にデバッガーをサービスプロセスに接続してみます。

于 2009-07-17T03:25:28.343 に答える
0

ServiceBehavior.AutomaticSessionShutdownを見てください。

于 2009-07-17T21:13:22.433 に答える
0

クライアントの Callback 関数の先頭で、OperationContext.Current.Channel.Close(); を使用します。

これで問題は解決します。

于 2009-09-25T11:09:28.860 に答える
0

サーバー側にセマフォがあり、クライアントのサービスが完了した後に解放されなかったときに、これが発生しました。

サーバー側のリソースまたはロックが適切に解放されていませんか? あなたのサービスインスタンスはセッションごとであるため、サーバーオブジェクトがぶらぶらしてロックを保持していると思われます。呼び出しごとに動作を変更するとどうなりますか?

于 2009-07-17T02:03:37.180 に答える