同じ 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 つの小さなオブジェクトしか返していないため)。