2012-12-12 12 views
7

Eventualmente il client Silverlight 4 WCF duplex inizia a ricevere gli errori 404 Not Found per i messaggi di polling, immediatamente dopo il polling inviato dal servizio WCF al client Silverlight, a volte ciò accade per il secondo sondaggio a volte la connettività funziona ore o anche giorni, ma per lo più fallisce nei primi minuti.Client Silverlight WCF che riceve risposta 404 non trovata per il messaggio di polling

! E la cosa interessante è come il noto bug di Silverlight 4 quando si usa la modalità duplex MaxMessagesPerPoll e la soluzione è descritta here e here ma sto usando la modalità SingleMessagePerPoll. Comunque ho provato a usare ClientStack come suggerito ma non è cambiato nulla.

flusso generale:

  1. client SL esegue metodo di servizio WCF, ha ricevuto risposta
  2. Quindi avviare cliente immediatamente SL invio di messaggi sondaggio al servizio e quindi ottenere eccezione per il secondo o il Ns messaggio sondaggio

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

  3. Fiddler mostra solo vuoto 404 risposta per un messaggio sondaggio
  4. Quindi client Chan evento nel Faulted sollevato

sto cercando di ricollegare client SL dopo tale difetto, unico flusso riconnessione tentativo:

  1. maniglia Faulted evento
  2. Cancellati tutti gli eventi di canale come Closed/Closing/Opened/Opening
  3. Chiudi canale nel modo giusto usando try { close } catch { abort }
  4. Tutti i seguenti in un nuovo thread poll thread: (I foudn questo funziona leggermente stabile - see this article)
  5. Attendere 45-70 secondi
  6. utilizzando la stessa istanza DuplexChannelFactory<T> creare un nuovo canale, iscriviti a tutti gli eventi di canale solo per scopi di registrazione
  7. metodo Execute servizio WCF

Dopo 1-10 tentativi (~ 1-10 minuti) il client alla fine si connette a un server e continua il normale polling.

Nel registro di servizio WCF vedo che ottiene tutte le richieste di cleint, elaborate senza eccezioni, quindi sembra che qualcosa accada sul lato client Silverlight.

Informazioni generali:

  • .NET Framework 4.0
  • metodi PollingDuplex
  • asincrone WCF
  • IIS 6.0 ospitato servizio WCF
  • Silverligth 4 cliente
  • OS client: Windows XP SP2
  • OS Server: Windows 2003 R2 SP2
  • autenticazione NTLM
  • DuplexMode: SingleMessagePerPoll
  • V'è un altro servizio WCF che fa richiesta/risposta prima che il mio servizio inizi a funzionare, non utilizza la connettività duplex
  • Sul servizio client SL sto registrando tutto nell'interfaccia utente in modo da vedere tutti gli eventi scorrere e avere tempo per ogni particolare evento
  • errori nei log di IIS, log degli eventi del server

Cliente:

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, multithread
  • Tutto è thread-safe
  • Nessuna eccezione del servizio server durante l'esecuzione
  • .515.053.691,36321 milioni
  • Un sacco di registrazione in modo da vedere che cosa sta succedendo su un servizio
  • Tutti WCF Le tracce sono abilitati con switchValue All, nulla di sospetto
<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

Controllare http://stackoverflow.com/questions/1521117/wcf-over-ssl-404-error –

+0

Grazie, ma non sembra il mio caso, non sto usando SSL e myservice a volte funziona senza 404 per un giorno, ma a volte non può funzionare bene anche 10 minuti – sll

risposta

1

Mentre indaga problema descritto in questo Stackoverflow inviare Static constructor called twice for PerSession WCF service ho trovato che Polling Duplex inizio lavoro stabile quando sono passato configurazione IIS per sottostante AppPool utilizzare processo di lavoro unico anziché 2 come specificato prima. Non sono sicuro del motivo per cui 2 è stato impostato in precedenza poiché non possiedo questo server, ma in ogni caso questo è quello che ho adesso - più client Silverlight lanciati sulla stessa macchina funzionano stabili e polling polls sondaggi e nessun errore 404, tutti i client si ricollegano in 1 tentativo dopo il riavvio e il riciclo di IIS ...

Vedere Performance Application Pool Settings per maggiori dettagli

TL; DR: Quando IIS ospitato WCF risiede in AppPool, che ha più di un processo di lavoro - polling duplex diventa instabile. Quindi, in caso di carico elevato, IIS ha avviato il secondo processo e ha iniziato a creare le istanze del servizio WCF anche nel secondo processo, quindi mi sono imbattuto in situazioni in cui la sessione client è stata creata in un unico processo ma a volte il sondaggio ha raggiunto un altro processo che non è al corrente dell'attuale connessione/sessione, quindi iniziare a rifiutare tali messaggi e l'intero errore di connessione.

Così Polling Duplex dal design non è scalabile su più processi in ambito di un unico server IIS e AppPool, in altre parole se si dispone di più di 1 processo di lavoro - questo è l'ambiente webGarden e duplex is not scalable across web farms and gardens

3

Se tutto sembra funzionare bene, allora forse questo è un problema di infrastruttura di rete/configurazione (es configurazione dns). Hai lo stesso problema quando esegui localmente o usi l'indirizzo IP al posto del nome host?

problema simile può verificarsi anche se si dispone di diversi attacchi configurati sul sito in IIS (vedi qui per i dettagli: http://blogs.msdn.com/b/rampo/archive/2008/02/11/how-can-wcf-support-multiple-iis-binding-specified-per-site.aspx)

Un'altra cosa è come si fa a comunicato dal server al client. Se si iterano i client in un ciclo e si richiamano i metodi di callback uno alla volta, è possibile che si verifichino timeout che verrebbero visualizzati come 404. In genere, la callback dovrebbe essere invocata su thread in background (uno per client).

A seconda della modalità di comunicazione, questo potrebbe essere causato anche dal deadlock (quando il thread dell'interfaccia utente è coinvolto nell'invio/ricezione di messaggi/richiamate da e verso il servizio).

+0

Grazie per il link, leggendo ora. In IIS un sito con ~ 15 VD e alcuni ha bidnings identici da runnign gli stessi servizi ma su porte diverse. 1) per quanto riguarda i clienti resposnes - Sto usando la modalità di istanza del servizio PerSession così singolo servizio per connessione client – sll

+0

E abbiamo 'multipleSiteBindingsEnabled' impostato su true in web.config – sll

+0

Per quanto riguarda i callback nei thread in background, sei sicuro che questo abbia senso per UI- meno servizi WCF? Inoltre ho scoperto che in caso di client SilverLigth non c'è modo di fare callback asincrono ?! Ad ogni modo eseguo l'invio manuale al thread dell'interfaccia utente e non ci sono eccezioni perché sono in grado di visualizzarle tutte – sll