【发布时间】:2011-11-07 11:11:58
【问题描述】:
系统说明:我有一个 WCF 服务(自托管在 Windows 服务中),由客户端(也是 Windows 服务)使用。这两个应用程序旨在具有恒定的正常运行时间。 “队列”应用程序从数据库中读取条目,将“作业”发送到 WCF 服务进行处理,该服务将一些信息返回给客户端,客户端将结果存储回数据库中。
错误详情:大约两个小时后,客户端应用程序无法再连接到报告错误的 WCF 服务:
"winsock 资源不足,无法完成套接字连接初始化。",
从此时起,在同一台服务器上运行的第二个应用程序也开始抛出异常:
“在建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。未找到或无法访问服务器。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)"
第二个应用程序与 WCF 客户端和服务器无关,它只是在同一台服务器上运行,只是读取/写入数据库。
服务器/客户端设置/代码:
服务器详情:
- 在 Windows 服务中自托管。
- netTcpBinding
- receiveTimeout="00:00:15"
- serviceThrottling maxConcurrentCalls="2147483647"
- maxConcurrentSessions="2147483647"
客户端连接类::
public class ClientConnectionClass : ClientBase<IFileService>, IFileService, IDisposable
{
public void callMethod(InputRequest request)
{
result = base.Channel.doRequest(request);
}
void Dispose()
{
bool success = false;
try
{
if (State != CommunicationState.Faulted)
{
Close();
success = true;
}
}
finally
{
if (!success)
{
Abort();
}
}
}
}
客户端进程(windows 服务):
while(true)
{
// Do some stuff before, code ommited
ClientConnectionClass ccc = new ClientConnectionClass();
ccc.callMethod(inputRequest);
// Do some stuff with the response
// Close the connection class, is this the right way to close it?
ccc.Close();
Thread.Sleep(1000);
}
可能的解释: 我认为基于第一个异常错误,代码没有关闭/释放套接字连接或用尽端口来连接(请注意,除了实现之外,我还从 ClientProcess 显式调用了 ClientBase 的 Close() 方法ClientBase 上的 Dispose() 方法)。
注意事项: 客户端应用程序是多线程的,最多同时运行 4 个并发线程,每个线程调用 WCF 服务。客户端到 WCF 服务完全正常工作,直到客户端进程吐出错误的 2 小时(ish)点,其他(不相关的)Windows 服务(使用网络资源)也开始吐出错误。
可能要回答的问题:我是否正在创建/处置实现 ClientBase 类的类?有没有更简单的方法来调试/记录客户端或 WCF 服务的当前状态(我已附加 perfmon.exe,但它并没有真正提供有关套接字/网络方面的太多有用信息)。
谢谢
更新:我现在实际上已经将 ClientConnectionClass 包装成一个“使用”语句,我目前正在测试这个(通常需要 2 小时)。 更新,这不起作用。
【问题讨论】:
-
我的预感会在你的线程上。尝试只运行一个线程,看看会发生什么