2016-06-08 21 views
0

Es wird lange Post sein, weil ich so viel Brei wie möglich erklären und mein Problem ausführlich beschreiben möchte. Ich bin neu in der Backend-Entwicklung und jetzt entwickle ich einen sicheren (https) REST-Web-Service mit WCF, C# und .NET Framework 4.5. In diesem Fall verwende ich ein selbstsigniertes Zertifikat, das in IIS konfiguriert wurde. Mein Problem ist, dass Service-Host scheint zufällig, ohne Ausnahme oder Nachricht im Ablaufprotokoll zu stürzen. Ich habe es in VMware auf Windows Server 2012 R2 getestet. Auf anderen Betriebssystemen (WS 2008, WS 2010) scheint das zu funktionieren. Hier ist, wie ich den Dienst mit der Registrierung für Eventhandler Faulted Zustand starten:Unerwarteter Absturz WCF-Dienst auf Windows Server 2012 R2

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); 
    } 
} 

Hier Handler für Fehlerzustand:

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); 
    } 
} 

Das ist mein app.config konfiguriert für MessageLogging und Tracing:

<?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> 

Ich habe mit diesem Problem seit etwa 1 Monat und kann keine Lösung finden. Ich habe viele Konfigurationen ausprobiert, und dieses Problem scheint irgendwo tiefer zu liegen. Ich habe das MSDN-Forum und support.microsoft überprüft. Dort fand ich ähnliche Probleme, aber nicht das gleiche, sie bieten einige Hotfixes, wie that. Ist das Problem möglicherweise mit der VM-Konfiguration verbunden? Vielen Dank im Voraus und für jede Beratung.

+0

Und was sagt Ihnen das Ereignisprotokoll (entweder das Anwendungsprotokoll oder das Systemprotokoll)? – rene

+0

Hallo, @rene, so in WCF Tracing Ich habe eine Fehlermeldung gefunden wie: Konnte keine Basisadresse finden, die Schema http für den Endpunkt mit Binding BasicHttpBinding entspricht. Registrierte Basisadressenschemata sind []. – Artiom

+0

@rene [Hotfix von Microsoft] (https://support.microsoft.com/en-us/kb/2537715), aber nur für WS2008R2. Ich habe versucht, es zu beheben, indem ich die BaseAddress in app.config-Datei gesetzt habe, dass dieser Fehler nicht mehr angezeigt wird, aber es löst nicht den Problemdienst weiterhin abstürzt. Ich habe fast alle Arten von Konfigurationen für Service versucht, aber immer noch keine Ergebnisse. Im Systemprotokoll und Anwendungsprotokoll - nichts, Service reagiert nur nicht mehr. Von Client-Seite (Android), wenn der Dienst heruntergefahren ist, sehe ich in den Nachrichten: Unbekannter Fehler während des Handshakes. – Artiom

Antwort

0

Endlich habe ich eine Lösung! Und ich verbringe zu viel Zeit, um ein so dummes Problem zu lösen und zu diagnostizieren. Hier ist, wie ich gehandelt:

  1. Ausführen -> cmd -> eventvwr
  2. Erhielt eine Log-Nachricht mit Fehlercode 0x8009030D von der Quelle HttpEvent.
  3. Diese Lösung wurde von msdn blog angewendet.

    Jetzt ist die Frage: Welches dieser 3 Szenarien hat mein Problem behoben? Und die zweite: Wie diese Fixes programmgesteuert anwenden? Viel Glück!

Verwandte Themen