系统描述:我有一个客户端(也是一个
Windows服务)使用的WCF服务(自托管在Windows服务中).这两个应用程序旨在实现持续的正常运行时间. ‘queue’应用程序从数据库中读取条目,将’jobs’发送到WCF服务进行处理,将一些信息返回给客户端,客户端将结果存储回DB.
错误详细信息:大约两个小时后,客户端应用程序无法再连接到报告错误的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类的Class?有没有更简单的方法来调试/记录客户端或WCF服务的当前状态(我已经附加了perfmon.exe,但它并没有真正提供有关套接字/网络方面的有用信息).
谢谢
更新:我现在实际上已将ClientConnectionClass包装成’using’语句,我目前正在测试它(通常需要2个小时).更新,这不起作用.
最佳答案 你在运行什么平台? Win2k3,Win2k8?我见过在Win2k8系统上运行的类似问题的应用程序网络上的未经证实的报告,这些系统在Win2k8上“解析”运行.此外,如果客户端和服务器在同一系统上运行,是否可以使用namedpipe绑定与nettcp?不是真正的修复,但可以解决您的特定问题.