意外的Windows服务器2012 R2上的WCF服务崩溃

问题描述:

这将是很长的后,因为我想尽可能解释和详细说明我的问题。我是后端开发新手,现在我正在使用WCF,C#和.NET Framework 4.5开发安全(https)REST Web服务。对于这种情况,我使用在IIS中配置的自签名证书。 我的问题是,服务主机似乎随机崩溃,没有任何异常或消息在跟踪日志。我在Windows Server 2012 R2上的VMware中进行了测试。在其他操作系统上(WS 2008,WS 2010)似乎工作正常。 这里是我如何与注册事件处理程序的故障状态启动服务:意外的Windows服务器2012 R2上的WCF服务崩溃

private ServiceHost listener = null; 

public void Start(byte[] certData, string certPassword) { 
    int port = Config.MobileServicePort; 

    SslCertificate cert = new SslCertificate(); 

    cert.RemoveCertificate(port); 
    cert.InstallCertificate(port, certData, certPassword); 

    Uri uri = new Uri(string.Format("https://127.0.0.1:{0}/{1}", port, "MobileService")); 

    if (listener != null) { 
     listener.Close(); 
     listener = null; 
    } 

    listener = new ServiceHost(typeof(MobileService), uri); 
    listener.Faulted += FaultedStateHandling; 

    try { 
     listener.Open(); 
     Logger.System().Info("REGISTER service at '{0}'", uri.ToString()); 
    } catch (TimeoutException timeEx) { 
     Logger.System().Error("Open timeout exception: " + timeEx); 
    } catch (CommunicationException comEx) { 
     Logger.System().Error("Open communication exception: " + comEx); 
    } catch (Exception ex) { 
     Logger.System().Error(ex); 
    } 
} 

这里是处理器的故障状态:

private void FaultedStateHandling(object sender, EventArgs e) { 
    try { 
     Logger.System().Info("<------------***Mobile service Faulted****------------>"); 
     listener.Abort(); 
     listener.Faulted -= new EventHandler(FaultedStateHandling); 
     int port = Config.MobileServicePort; 
     Uri uri = new Uri(string.Format("https://127.0.0.1:{0}/{1}", port, "MobileService")); 
     listener = new ServiceHost(typeof(MobileService), uri); 
     listener.Faulted += new EventHandler(FaultedStateHandling); 
     listener.Open(); 
     Logger.System().Info("<------------***Mobile service Restarted****------------>"); 
    } catch (Exception ex) { 
     Logger.System().Error(ex); 
    } 
} 

这是我的app.config配置MessageLogging和跟踪:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Critical,Information,ActivityTracing" 
       propagateActivity="true"> 
     <listeners> 
      <add name="messages" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData="c:\log\TraceMessages.svclog" /> 
     </listeners> 
     </source> 

     <source name="System.ServiceModel.MessageLogging"> 
     <listeners> 
      <add name="messages" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData="c:\log\MessageLogging.svclog" /> 
     </listeners> 
     </source> 

    </sources> 
    <trace autoflush="true" /> 
    </system.diagnostics> 

<system.serviceModel> 
    <diagnostics> 
    <messageLogging 
      logEntireMessage="false" 
      logMalformedMessages="true" 
      logMessagesAtServiceLevel="true" 
      logMessagesAtTransportLevel="false" 
      maxMessagesToLog="500" 
      maxSizeOfMessageToLog="5000"/> 
    </diagnostics> 
<services> 
    <service behaviorConfiguration="MobileBehavior"  name="noq.Mobile.Service.MobileService"> 
    <endpoint address="" binding="webHttpBinding" 
         bindingConfiguration="webHttpTransportSecurity" 
         behaviorConfiguration="REST" 
         contract="noq.Mobile.Service.IMobileService"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" 
       binding="mexHttpsBinding" 
       contract="IMetadataExchange" /> 
    <!--<host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:11082/MobileService/" /> 
     </baseAddresses> 
    </host>--> 
    </service> 
</services> 
<bindings> 
    <webHttpBinding> 
    <binding name="webHttpTransportSecurity" maxBufferSize="1000000000" 
     maxReceivedMessageSize="1000000000"> 
     <readerQuotas maxStringContentLength="1000000000" /> 
     <security mode="Transport" /> 
    </binding> 
    </webHttpBinding> 
</bindings> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="REST"> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name="MobileBehavior"> 
     <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
</system.serviceModel> 
<startup> 
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
</startup> 
</configuration> 

我用这个问题存货了大约1个月,并且找不到解决方案。我尝试了很多配置,看起来问题更深入。我检查了MSDN论坛和support.microsoft。在那里我发现了类似的问题,但不一样,他们提供了一些热修复,如that。 这个问题可能与虚拟机配置有关吗? 在此先感谢您并提供任何建议。

+0

事件日志(应用程序日志或系统日志)告诉你什么? – rene

+0

嗨,@rene,所以在WCF跟踪中,我发现了一条错误消息:无法找到与绑定BasicHttpBinding的端点匹配方案http的基地址。注册的基地址方案是[]。 – Artiom

+0

@rene [微软提供的修补程序](https://support.microsoft.com/en-us/kb/2537715),但仅适用于WS2008R2。我试图通过在app.config文件中设置BaseAddress来解决此问题,使得此错误不再出现,但它不能解决问题服务仍然崩溃的问题。我尝试了几乎所有类型的服务配置,但仍然没有结果。在系统日志和应用程序日志中 - 什么也没有,服务只是停止响应从客户端(Android),当服务关闭时,在日志中看到消息:握手期间发生未知错误。 – Artiom

最后我有一个解决方案!我花了太多时间来解决和诊断这样一个愚蠢的问题。这是我如何行事:

  1. 运行 - > CMD - > EVENTVWR
  2. 有一个日志,错误代码0x8009030D从源头HttpEvent消息。
  3. 应用此解决方案从msdn blog

    现在的问题是:这3个方案中的哪一个解决了我的问题? 而第二个:如何以编程方式应用此修复程序? 祝你好运! Arty