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的请求,但没有写入任何日志。从视觉角度来看,这是不响应与正常图形之间的区别。
![non-responding](https://istack.dev59.com/fox0O.webp)
![enter image description here](https://istack.dev59.com/tqMRo.webp)
有什么想法可能是根本原因吗?
编辑 - 重新启动后
重新启动后 - 没有做任何其他更改 - 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