c# - WCF 连接重置 : server reboot needed

标签 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();

处理程序是这样实现的:

 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

我的感觉是 channel 监听器不工作,但跟踪日志中没有显示任何问题。 服务器只是停止响应对此 WCF 的请求,但从那一刻起它没有向日志写入任何内容。 从视觉角度来看,这是无响应与正常图表。

non-responding - 对比 - enter image description here

有人能提出比重启服务器更温和的解决方案吗?显然,已经尝试重新启动主机服务(以及其他系统服务,如 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)
-------------------------------------------------------

最佳答案

这是旧版 .Net 4.0 的 WCF 线程池中的错误。 您可以找到一些引用资料 herehere .

您应该将服务帐户从本地系统移动到本地服务。这是为本地服务帐户保留 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 服务在高负载运行后可能会变得无响应

If the symptoms apply, restart the server hosting the unresponsive service.

一个有趣的 msdn 建议在这里可能是合适的

故障排除:Connection Forcibly Closed

原因:

Faulty network hardware is dropping portions of the TCP traffic

The SynAttackProtect setting may be dropping connections.

查看以下注册表可能会有用

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

以下article提到 2 个原因:

  • 操作系统用完了 TCP 缓冲区的内存
  • 操作系统耗尽了可用的 TCP“临时”端口(KB Microsoft 指的是上述注册表 tcp/ip parameters)

关于c# - WCF 连接重置 : server reboot needed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36870516/

相关文章:

wcf - 序列化合约方法参数时如何自定义 WCF 使用的流程?

php - 64 位 php 时间戳问题

c# - 在 C# 中,label.Update() 不起作用,但 textbox.Update() 起作用?

c# - QuoteState 不存在?

c# - 操作对于 LINQ to SQL ExecuteCommand 事务的状态无效

c# - 将 List<Interface> 作为 WCF 方法参数发送

生产服务器上的 ASP.NET session 问题

windows-server-2003 - Windows 的 Plesk 替代品

c# - 实体对象的使用

c# - 命名用户控件。习俗?