系统描述:我有一个客户端(也是Windows服务)使用的WCF服务(自托管在Windows服务中)。这两个应用程序设计为具有恒定的正常运行时间。 '队列'应用程序从数据库中读取条目,将'作业'发送到WCF服务进行处理,然后将某些信息返回给客户端,然后客户端将结果存储回数据库。WCF客户端错误“可用的winsock资源不足”大约2小时后
错误详细信息:大约两个小时的客户端应用程序后无法再连接到WCF服务报告错误:
“不足winsock的可用资源来完成套接字连接初始化。”,
它运行在同一台服务器上的第二个应用程序也开始从这个时候起抛出异常:
“,而与SQL Server建立连接时出现与网络相关的或特定于实例的错误服务器(提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)“
(错误:40 - 无法打开与SQL Server的连接)验证实例名称是否正确并且SQL Server已配置为允许远程连接。第二个应用程序与WCF客户端和服务器无关,它只是运行在山姆e服务器,并简单地读/写数据库。
服务器/客户端安装程序/代码:
服务器详细信息:
- 自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);
}
可能的解释: 我认为,基于第一异常错误,代码不打烊/释放套接字连接或用完的端口上连接(请注意,我明确地调用Close ()方法,除了在ClientBase上实现Dispose()方法外)。
说明:客户端应用程序是多线程的,最多有4个并发线程同时运行,每个线程都调用WCF服务。客户端到WCF服务正在全面开展工作,直到客户端进程吐出错误的2小时(ish)点和其他(无关的)Windows服务(使用网络资源)也开始吐出错误。
可能的问题回答:我是创建/处置实现ClientBase类的类吗?有没有更简单的方法来调试/记录客户端或WCF服务的当前状态(我已经连接了perfmon.exe,但它并没有真正提供有关套接字/网络方面的有用信息)。
感谢
更新:我其实现在包裹ClientConnectionClass成“使用”声明,我目前正在测试的(这通常需要2小时)。 更新,这没有奏效。
我的预感会在你的线上。尝试只运行一个线程,看看会发生什么 –