2

同じ Windows サービスにローカルにインストールされている 2 つの WCF サービスがあります。2 つの WCF サービスは、同じデータベースを呼び出し、Net TCP Binding を使用します。

補足: サービスのメソッドが多すぎたため、1 つではなく 2 つのサービスを作成しました。その結果、XML ファイルが大きすぎて、コンシューマー アプリにサービス参照を追加できませんでした。また、このように読みやすくなっています。

クライアント アプリで、両方の WCF サービスへのサービス参照を追加しました。サービスを使用するために、CommunicationObject を拡張して "Using()" メソッドを追加しました。以下のコードを参照してください。

.Using() メソッドの通信オブジェクト拡張

public static class CommunicationObjectExtensions
{
    public static void Using<T>(this T client, Action<T> work)
        where T : ICommunicationObject
    {
        try
        {
            // make sure client is open
            //client.Open(); // didn't work                
            work(client);
        }
        catch (CommunicationException e)
        {
            client.Abort();
            throw;
        }
        catch (TimeoutException e)
        {
            client.Abort();
            throw;
        }
        catch (Exception e)
        {
            client.Abort();
            throw;
        }
        finally
        {
            client.Close();
        }
    }
}

サービスコール

new ServiceClientA().Using(client =>
    {
        var someObjectA = client.GetSomeObjectA();
    });
new ServiceClientB().Using(client =>
    {
        var someObjectB = client.GetSomeObjectB();
    });

ServiceClientB のメソッドに実際に返されるデータがあり (空のリストではなく)、返される (サービス呼び出し全体をデバッグして実行できる) 場合、「ソケット接続が破棄されました」というエラーが表示されます。

別のデータベースを指す他の WCF サービスを使用している場合、この問題は発生しません。

何が起こっているのか誰にも考えがありますか?

アップデート

私が呼び出しているメソッド (client.GetSomeObjectB()) でのみ発生することがわかりました。返されたオブジェクトがエラーを引き起こしています。どうやらこれはオブジェクトが大きすぎるためですが、問題にはならないはずです (1 つの小さなオブジェクトしか返していないため)。

4

0 に答える 0