我有 2 个 WCF 服务,它们都本地安装在同一个 Windows 服务上。2 个 WCF 服务调用同一个数据库并使用 Net TCP 绑定。
旁注:我创建了 2 个服务而不是 1 个,因为该服务的方法太多,因此 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 个小对象)。