此问题与Windows Server 2003上的Windows服务中托管的WCF有关。
问题发生在正确工作几天后,只能通过重新启动服务器来修复。
C#代码在其日志
中没有捕获任何异常serviceHost.Opening += new EventHandler(serviceHost_Opening);
serviceHost.Opened += new EventHandler(serviceHost_Opened);
serviceHost.Closing += new EventHandler(serviceHost_Closing);
serviceHost.Closed += new EventHandler(serviceHost_Closed);
serviceHost.Faulted += new EventHandler(serviceHost_Faulted);
serviceHost.UnknownMessageReceived += new EventHandler<UnknownMessageReceivedEventArgs>(serviceHost_UnknownMessageReceived);
serviceHost.Open();
处理程序的实现方式如下:
void serviceHost_Opened(object sender, EventArgs e)
{
CentralReport.MyService.SrvLog("WinCentralRpt",String.Format("service opened by sender: {0}", sender.GetType().ToString()));
}
void serviceHost_Opening(object sender, EventArgs e)
{
CentralReport.MyService.SrvLog("WinCentralRpt",String.Format("service opening by sender: {0}", sender.GetType().ToString()));
}
public static void SrvLog(string user, string line) {
string log_path = System.Configuration.ConfigurationManager.AppSettings["srv_log"];
if (log_path != null) {
using (System.IO.StreamWriter logSW = new System.IO.StreamWriter(
log_path.Replace("{user}",user.ToLower()),true)) {
logSW.WriteLine(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss tt", CultureInfo.InvariantCulture) + ": " + line);
}
}
}
在客户端,C#WCF使用者在调用操作后正确关闭连接。
已激活最高级别跟踪。
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="All"
propagateActivity="true">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="CardSpace"
switchValue="All">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.IO.Log"
switchValue="All">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.Runtime.Serialization"
switchValue="All">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.IdentityModel"
switchValue="All">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging"
switchValue="All">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.ServiceModel.Activation"
switchValue="All">
<listeners>
<add name="xml" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="C:\MyPath\Traces.svclog" />
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>
带
<system.serviceModel>
<diagnostics wmiProviderEnabled="true">
<messageLogging
logEntireMessage="true"
logMalformedMessages="true"
logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="true"
maxMessagesToLog="3000"
/>
</diagnostics>
和
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<dataContractSerializer maxItemsInObjectGraph="6553500"/>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
操作系统检查似乎很好
netstat -ao | grep 9nnn
tasklist /SVC | grep Opxxx
我的感觉是频道监听器无法正常工作,但跟踪日志中没有任何问题。 服务器只是停止响应此WCF的请求,但它从那一刻开始就不向日志写入任何内容。 从视觉角度来看,这是无响应和无效的图形。
有人建议比重启服务器更软的解决方案吗?显然,已经尝试重启主机服务(以及其他系统服务,如dns和ipsec),甚至重新安装了WCF。只有重新启动服务器才能解决问题。
知道可能是什么原因?
编辑 - 重启后
重新启动后 - 没有任何其他更改 - WCF再次开始工作。
旁注
还有一点我不完全明白。 现在正在运行 - 当一切正常时 - 命令
httpcfg.exe query urlacl
这是Windows 2003版本的
netsh http show urlacl
我原本希望看到WCF网址,但输出只是(为什么?)
C:\>httpcfg.exe query urlacl
URL : http://+:80/Temporary_Listen_Addresses/
ACL : D:(A;;GX;;;WD)
-------------------------------------------------------
答案 0 :(得分:1)
这是旧版.Net 4.0版本的WCF ThreadPool中的一个错误。 您可以找到一些参考文献here和here。
您应该将服务帐户从本地系统移动到本地服务。这是用于保留本地服务帐户的URL的Windows 2003命令。
httpcfg set urlacl /u http://+:9nnn/Your/Url/ /a "D:(A;;GX;;;LS)"
此外,您只需启用WCF性能计数器并关闭WCF跟踪。
<system.serviceModel>
<diagnostics performanceCounters="All" />
...
它们将显示在性能监视器的Service.ModelService类别下。
总之,使用单独的进程或使用不同的(非WCF)工作服务替换WCF服务中的线程操作(如数据库访问等)。
全世界都记录了类似的问题
Technical Bulletin:运行高负载后,WCF服务可能无响应
如果症状适用,请重新启动托管无响应的服务器 服务。
这里有一个有趣的msdn建议
故障排除:Connection Forcibly Closed
原因:
网络硬件故障正在丢弃部分TCP流量
或
SynAttackProtect设置可能会丢弃连接。
查看以下注册表可能会很有用
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
以下article提到了两个原因:
答案 1 :(得分:1)
这是非分页池资源问题。
无响应的WCF只是一个早鸟信息,在此之前发送。
实际上,以下是内存泄漏的典型症状
你仍然可以ping服务器,它仍然处理一些基本的 命令,如关机命令,但不允许浏览 文件或文件夹,你不能RDP到服务器。
您有几种工具可以监控它:
请Pearman和Russinovich阅读这两篇文章,以获取完整的指导。
您还可以查看\System32\LogFiles\HTTPERR
下的http日志。
可能会应用hotfix。
答案 2 :(得分:0)
我以前在使用过Web服务的旧版Windows上使用MemoryStream和Binary Writers时遇到了奇怪的问题。没有什么比这更有意义了,不知道它是硬件限制还是一些奇怪的一次性.Net错误。也许尝试将Stream拉出使用块并使用Try-Finally情况处理它。在过去与二进制编写器的问题,我将不得不自己处理它,它工作正常。几乎像“使用”块试图在它完成之前关闭所有东西。
答案 3 :(得分:0)
您是否正在使用服务中的服务? 请记住在消耗服务的任何地方关闭连接(即使在服务器端)。
在WCF中,您可能知道存在ChannelFactory
,该工厂为您提供服务代理,但它也是ICommunicationObject
,您必须配置该服务代理实例以关闭连接。 / p>
使用指令PerRequest
检查ServiceHost销毁,以监控是否允许处置服务主机实例,以及是否存在代码的其他部分中存在的硬引用,而不允许使用Gcollected。
我认为您可能已经计算出最大连接数。