2012-12-12 10 views
7

Schließlich WCF Duplex Silverlight 4 Client starten 404 Not Found Fehler für Poll-Nachrichten, sofort nach Umfrage wurde vom WCF-Dienst an Silverlight-Client gesendet, manchmal passiert dies für die zweite Umfrage manchmal Konnektivität Stunden arbeitet oder sogar Tage, aber meistens scheitert die erste Minute.WCF Silverlight-Client 404 nicht gefunden Antwort für Umfrage-Nachricht

! Und was das Thema ist interessant ist wie bekannt Silverlight 4 Fehler bei der Verwendung von MaxMessagesPerPoll Duplex-Modus und Lösung wird here und here beschrieben, aber ich bin mit SingleMessagePerPoll Modus. ANyway versuchte ich mit ClientStack wie vorgeschlagen, aber nichts geändert.

Allgemeiner Fluss:

  1. SL Client führt WCF-Service-Methode, empfangene Antwort
  2. Dann sofort SL Client Umfrage Nachrichten-Dienst starten zu senden und dann Ausnahme immer für die zweite oder Ns Umfrage Nachricht

    System.Net.WebException: The remote server returned an error: NotFound

  3. Fiddler zeigen nur leere 404 Antwort für eine Umfrage Nachricht
  4. Dann Client Chan nel Faulted Ereignis ausgelöst

Ich versuche, SL-Client nach einer solchen Störung, einzelne Reconnect Wiederholungsfluss wieder zu verbinden:

  1. Griff Faulted Ereignis
  2. Abmelden alle Kanalereignisse wie Closed/Closing/Opened/Opening
  3. Schließen Kanal in einem richtigen Weg try { close } catch { abort }
  4. All unten in einem neuen Thread poll-Thread mit: (I foudn das funktioniert leicht stabil - see this article)
  5. Warten Sie 45-70 Sekunden
  6. die gleiche DuplexChannelFactory<T> Instanz Mit einem neuen Kanal erstellen, für alle Kanalereignisse abonnieren Sie doch einfach zur Protokollierung
  7. WCF-Service-Methode
  8. Execute

Nach 1-10 Wiederholungen (~ 1-10 Minuten) Client schließlich mit einem Server verbinden und normales Polling fortsetzen.

In WCF-Dienstprotokoll sehe ich alles cleint Anfrage bekommen, ohne jede Ausnahme verarbeitet, so scheint es, etwas auf Silverlight Client-Seite geschieht.

Allgemeine Informationen:

  • .NET Framework 4.0
  • PollingDuplex
  • Async WCF Methoden
  • IIS 6.0 gehosteten WCF-Dienst
  • Silverligth 4 Client
  • Client-Betriebssystem: Windows XP SP2
  • Server OS: Windows 2003 R2 SP2
  • NTLM-Authentifizierung
  • DuplexMode: SingleMessagePerPoll
  • Es gibt einen anderen WCF-Dienst die nicht Request/Reply vor meinem Dienst zu arbeiten beginnen, verwendet es nicht Duplex-Konnektivität
  • auf SL-Client-Dienst ich alles in die UI bin Protokollierung so alle Veranstaltungen fließen und haben Zeit für jede einzelne Veranstaltung
  • keine Fehler in IIS-Protokolle, Server-Ereignisprotokolle

Auftraggeber:

var binaryBinding = new BinaryMessageEncodingBindingElement(); 
binaryBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue; 

var httpbindingElement = new HttpTransportBindingElement 
{ 
    MaxReceivedMessageSize = 131072 
}; 

var pollingDuplexBindingElement = new PollingDuplexBindingElement 
{ 
    ClientPollTimeout = new TimeSpan(0, 0, 1, 30), 
    InactivityTimeout = new TimeSpan(0, 8, 0, 0), 
}; 


_binding = new CustomBinding(
      pollingDuplexBindingElement, 
      binaryBinding, 
      httpbindingElement) 
     { 
      SendTimeout = new TimeSpan(0, 0, 0, 45), 
      CloseTimeout = new TimeSpan(0, 0, 0, 25), 
      ReceiveTimeout = new TimeSpan(0, 8, 0, 0), 
      OpenTimeout = new TimeSpan(0, 0, 0, 45) 
     }; 


httpbindingElement.AuthenticationScheme = AuthenticationSchemes.Negotiate; 
var endpoint = new EndpointAddress(_endpointAddress); 
_channelFactory = new DuplexChannelFactory<TWebService>(
         new InstanceContext(instanceOfClientServiceClass), 
         _binding, 
         endpoint); 


// then this factory used to create a new channels 
// Also for a new channel I'm setting OpTimeout 
var contextChannel = newChannel as IContextChannel; 
if (contextChannel != null) 
{ 
    contextChannel.OperationTimeout = TimeSpan.FromSeconds(45); 
} 

Server:

  • WCF, PerSession, multithreaded
  • Alles ist Thread-sicher
  • Keine Serverdienstausnahmen während der Ausführung
  • so
  • Viele Protokollierung sehe ich, was auf einen Dienst wird auf
  • Alle WCF Spuren aktiviert sind mit switchValue All, nichts Verdächtiges
<binding name="customName" 
      sendTimeout="00:01:00" 
      receiveTimeout="08:00:00" 
      openTimeout="00:01:00" 
      closeTimeout="00:00:35"> 
    <pollingDuplex 
     inactivityTimeout="08:00:00" 
     serverPollTimeout="00:01:00" /> 
     <binaryMessageEncoding /> 
      <httpTransport authenticationScheme="Ntlm" 
          maxReceivedMessageSize="131072">    
     </httpTransport> 
</binding> 

<behavior name="customBehavior"> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <serviceThrottling 
      maxConcurrentCalls = "500" 
      maxConcurrentSessions = "500" 
      maxConcurrentInstances = "500" /> 
</behavior> 
+0

überprüfen http://stackoverflow.com/questions/1521117/wcf-over-ssl-404-error –

+0

Danke, aber scheint nicht mein Fall, ich benutze SSL nicht und myservice funktioniert manchmal ohne 404 für einen Tag, aber manchmal kann nicht arbeiten gut sogar 10 Minuten – sll

Antwort

1

Während Problem auf diesem beschriebene Untersuchung Stackoverflow Static constructor called twice for PerSession WCF service Post fand ich, dass Polling Duplex Start stabil arbeiten, wenn ich für zugrunde liegenden AppPoolIIS Konfiguration geschaltet eher einzigen Arbeitsprozess zu verwenden, als 2 wie zuvor angegeben wurde. Ich bin mir nicht sicher, warum 2 gesetzt wurde, bevor da ich diesen Server nicht besitzen, aber trotzdem ist das, was ich habe jetzt - mehrere Silverlight-Clients auf demselben Rechner gestartet arbeiten stabil und Umfragen Umfragen Umfragen und keine 404 Fehler, alle Clients erneut eine Verbindung in 1 Versuch nach IIS neu gestartet und recycelt ...

Siehe Performance Application Pool Settings für weitere Details

TL; DR: Wenn IIS gehosteten WCF in AppPool befindet, die mehr als ein Arbeitsprozess hat - Polling Duplex instabil wird. Im Falle einer hohen Auslastung startete IIS den zweiten Prozess und begann auch, WCF-Dienstinstanzen im zweiten Prozess zu erstellen. So kam ich in eine Situation, in der die Clientsitzung in einem Prozess erstellt wurde, aber es scheint, dass Poll einen anderen Prozess erreicht hat Verbindung/Sitzung beginnen, solche Nachrichten und den gesamten Verbindungsfehler ablehnen.

So Polling Duplex ist konstruktionsbedingt über mehrere Prozesse in Rahmen eines einzigen IIS-Server und AppPool nicht skalierbar, mit anderen Worten, wenn Sie mehr als 1 Arbeitsprozess - das ist WebGarden Umwelt und duplex is not scalable across web farms and gardens

3

Wenn alles scheint in Ordnung zu arbeiten, dann vielleicht dies ist ein Netzwerkinfrastruktur-/Konfigurationsproblem (z. B. DNS-Konfiguration). Erhalten Sie das gleiche Problem, wenn Sie lokal oder mit IP-Adresse anstelle von Host-Namen ausführen?

ähnliches Problem kann auch auftreten, wenn Sie auf der Website in IIS (siehe hier für weitere Details: http://blogs.msdn.com/b/rampo/archive/2008/02/11/how-can-wcf-support-multiple-iis-binding-specified-per-site.aspx) konfigurierten mehrere Bindungen haben

Eine andere Sache ist, wie Sie vom Server an den Kunden mitgeteilt haben. Wenn Sie Clients in einer Schleife durchlaufen und Callback-Methoden nacheinander aufrufen, erhalten Sie möglicherweise Timeouts, die als 404s angezeigt werden. Callback sollte generell für Hintergrund-Threads aufgerufen werden (eine pro Client).

Je nachdem, wie Sie die Kommunikation zu tun, dies auch durch die Blockade verursacht werden kann (wenn UI-Thread in Senden beteiligt ist/Empfangen von Nachrichten/Rückrufe und von Service).

+0

Danke für den Link, jetzt lesen. In IIS hat eine Site ~ 15 VDs und einige haben identische Bidnings, da sie die gleichen Dienste, aber auf verschiedenen Ports ausführen. 1) in Bezug auf Client-Resposes - Ich benutze PerSession Service Instanz Modus so Single-Service pro Client-Verbindung – sll

+0

Und wir haben 'multipleSiteBindingsEnabled' in web.config auf True gesetzt – sll

+0

In Bezug auf Rückrufe in Hintergrund Threads, sind Sie sicher, dass dies sinnvoll für UI- weniger WCF-Service? Auch habe ich festgestellt, dass im Falle von Silverlight Client keine Möglichkeit besteht async Callback durchzuführen ?! Wie auch immer, ich manuell zu UI-Thread und dort arw keine Ausnahmen, da ich alle anzeigen, damit sie angezeigt werden können – sll