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:
- client SL esegue metodo di servizio WCF, ha ricevuto risposta
- 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
- Fiddler mostra solo vuoto
404
risposta per un messaggio sondaggio - Quindi client Chan evento nel Faulted sollevato
sto cercando di ricollegare client SL dopo tale difetto, unico flusso riconnessione tentativo:
- maniglia
Faulted
evento - Cancellati tutti gli eventi di canale come
Closed/Closing/Opened/Opening
- Chiudi canale nel modo giusto usando
try { close } catch { abort }
- Tutti i seguenti in un nuovo thread poll thread: (I foudn questo funziona leggermente stabile - see this article)
- Attendere 45-70 secondi
- utilizzando la stessa istanza
DuplexChannelFactory<T>
creare un nuovo canale, iscriviti a tutti gli eventi di canale solo per scopi di registrazione - 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>
Controllare http://stackoverflow.com/questions/1521117/wcf-over-ssl-404-error –
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