【发布时间】:2016-08-20 14:40:39
【问题描述】:
此问题与 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 url,但输出只是(为什么?)
C:\>httpcfg.exe query urlacl
URL : http://+:80/Temporary_Listen_Addresses/
ACL : D:(A;;GX;;;WD)
-------------------------------------------------------
【问题讨论】:
-
所有这些事件的背景是什么?也许
serviceHost没有被收集,因为事件处理程序保留了一个引用。如果您真的需要它们,请确保在关闭前-=它们。 -
@Crowcoder 问题已编辑以包含处理程序的示例:它们只是编写一个日志文件。但也请考虑我已经激活了更详细的 wcf 跟踪...
-
好吧,我不知道。我会说尝试运行 ANTs 分析器并使用日志库或队列中介使您的日志线程安全。
-
@Crowcoder 我很感激,非常感谢,但请注意 wcf 也停止响应与我的处理程序无关的元数据 wsdl 请求,它是完全标准的,它应该只被捕获跟踪...顺便说一句,当我重新启动服务时,即使它没有响应,Windows 服务重新启动也会在日志中定期跟踪...
-
很可能你达到了一些油门限制(因为一些阻止会话/实例关闭的错误。你的油门配置是什么?msdn.microsoft.com/en-us/library/ms731379(v=vs.110).aspx。尝试将油门值设置得非常低,然后让一些调用,看看你是否可以重现你的问题。还要检查来自 wcf 的消息的 Windows 日志 - 它应该在达到这些限制时进行跟踪。
标签: c# wcf windows-server-2003