WCF连接重置:需要重新启动服务器

9 c# wcf windows-server-2003

此问题与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();
Run Code Online (Sandbox Code Playgroud)

处理程序的实现方式如下:

 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);
        }   
    }
}
Run Code Online (Sandbox Code Playgroud)

在客户端,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> 
Run Code Online (Sandbox Code Playgroud)

    <system.serviceModel>
  <diagnostics wmiProviderEnabled="true">
      <messageLogging 
           logEntireMessage="true" 
           logMalformedMessages="true"
           logMessagesAtServiceLevel="true" 
           logMessagesAtTransportLevel="true"
           maxMessagesToLog="3000" 
       />
  </diagnostics>
Run Code Online (Sandbox Code Playgroud)

    <serviceBehaviors>
        <behavior name="MyServiceBehavior">
            <dataContractSerializer maxItemsInObjectGraph="6553500"/>
            <serviceMetadata httpGetEnabled="true"/>
            <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
    </serviceBehaviors>
Run Code Online (Sandbox Code Playgroud)

操作系统检查似乎没问题

netstat -ao | grep 9nnn
tasklist /SVC | grep Opxxx
Run Code Online (Sandbox Code Playgroud)

我的感觉是频道监听器不工作,但跟踪日志中没有任何问题.服务器只是停止响应此WCF的请求,但它从那一刻开始就不向日志写入任何内容.从视觉角度来看,它是无响应的与OK的图形.

非响应 - vs - 在此输入图像描述

有人建议比重启服务器更软的解决方案吗?显然,已经尝试重启主机服务(以及其他系统服务,如dns和ipsec),甚至重新安装了WCF.只有重启服务器才能解决问题.

知道什么可能是根本原因?

编辑 - 重启后

重启后 - 没有任何其他更改 - WCF再次开始工作.

边注

还有一点我不完全理解.现在运行 - 当一切正常 - 命令

httpcfg.exe query urlacl 
Run Code Online (Sandbox Code Playgroud)

那是Windows 2003的版本

netsh http show urlacl
Run Code Online (Sandbox Code Playgroud)

我本来希望看到WCF网址,但输出只是(为什么?)

C:\>httpcfg.exe query urlacl
    URL : http://+:80/Temporary_Listen_Addresses/
    ACL : D:(A;;GX;;;WD)
-------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

Kev*_*rns 0

我以前在使用 Web 服务的旧版 Windows 上使用 MemoryStream 和二进制写入器时遇到过奇怪的问题。没有什么意义,不知道这是硬件限制还是一些奇怪的一次性 .Net bug。也许尝试将 Stream 从 using 块中拉出并使用 Try-Finally 情况进行处理。在过去,对于二进制编写器的问题,我必须自己处理,而且效果很好。几乎就像“使用”块试图在完成之前关闭所有内容。