2011-08-26 12 views
45

Ho un servizio Web WCF che funziona correttamente. Tuttavia c'è una chiamata in particolare che sta fallendo - ma fallisce solo per alcuni utenti. La chiamata è piuttosto semplice: è una chiamata per ottenere un elenco di oggetti Person.Una connessione esistente è stata forzatamente chiusa dall'host remoto - WCF

Per l'utente A funziona correttamente. Il servizio interroga il database, crea l'elenco di oggetti Person e lo restituisce all'applicazione chiamante.

Per l'utente B non riesce. La cosa strana è che quando faccio il debug del servizio sembra funzionare bene. È in grado di interrogare il database e crea l'oggetto List e lo restituisce. Il servizio in sé non fallisce mai. Ma l'applicazione client riceve l'errore "Una connessione esistente è stata chiusa forzatamente dall'host remoto".

Per me sembra che qualcosa stia accadendo quando il livello di servizio sta cercando di impacchettare i dati in formato XML per rimandarli all'applicazione chiamante. Sto pensando che debba trattarsi di un problema correlato ai dati perché la chiamata funziona bene per gli altri utenti. Ho visivamente guardato i dati e non vedo nulla di strano. Un'ipotesi è che i dati per l'utente B abbiano alcuni caratteri nascosti funky o qualcosa e, pertanto, causano la chiusura imprevista del servizio. Qualcosa del genere.

Qualche idea?

+0

Forse aiuta - Avevo cancellato l'applicazione del servizio web dal server mentre il servizio veniva chiamato dai client e ho ricevuto questo errore nei miei log degli errori .. – xameeramir

risposta

71

La cosa migliore che ho trovato per diagnosticare cose come questa è il visualizzatore di tracce del servizio. E 'piuttosto semplice da configurare (supponendo che si può modificare il file di configurazione):

http://msdn.microsoft.com/en-us/library/ms732023.aspx

Spero che questo aiuti.

+12

Questo ha aiutato! Ho avuto un problema simile e nel mio caso, ServiceTraceViewer mi ha mostrato un'eccezione durante il tentativo di serializzare un valore enum. L'operazione stava cercando di restituire un oggetto che includesse questo enum senza inizializzarlo prima, e la definizione enum non aveva alcun membro per il valore predefinito (0). Quindi non è stato possibile serializzare 0. –

+0

Ho fatto questo e mi ha permesso di individuare il problema. Nel mio caso era una NullReferenceException durante la serializzazione al client. Ecco cosa voglio sapere: perché la mia eccezione originale è stata sepolta in questo problema di connessione? Non era nemmeno una delle eccezioni interne, ma era la causa del problema. Questo è ritardato e ho bisogno di trovare un modo per superare questo. Potrei pubblicare una nuova domanda in idk ... – toddmo

11

Ho visto questa volta. Gli utenti richiedono differenti quantità di dati? Ho scoperto che anche se è possibile configurare un'associazione per i payload di dati (ad esempio maxReceivedMessageSize), lo httpRuntimemaxRequestLength supera l'impostazione WCF, quindi se IIS sta tentando di soddisfare una richiesta che supera tale valore, questo comportamento si manifesta.

Pensate a come questo:

Se maxReceivedMessageSize è 12MB nel vostro comportamento WCF e maxRequestLength è 4MB (default), IIS vince.

+2

Non penso sia così. Ho provato a modificare i dati che è stato restituito per ridurlo e non ha funzionato. La query normale restituisce 63 righe. L'ho modificato per restituire solo 1 riga e non riesce ancora. I dati per l'utente A restituiscono 26 righe e funziona correttamente. Quando modifico i dati per l'utente B per restituire solo 1 riga, non riesce ancora. Molto strano. –

22

Ho riscontrato questo problema perché il mio sito Web non ha un certificato associato alla porta SSL. Ho pensato di parlarne perché non ho trovato questa risposta da nessuna parte nel googleweb e mi ci sono volute ore per capirlo. Nulla è apparso nel visualizzatore dell'evento, che è stato assolutamente fantastico per diagnosticarlo. Spero che questo salvi qualcun altro dal dolore.

6

Ho appena avuto questo errore ora solo server e la soluzione era quella di impostare un attributo maxItemsInObjectGraph in WCF web.config sotto <behavior> tag:

<dataContractSerializer maxItemsInObjectGraph="2147483646"/> 
3

ho catturato la stessa eccezione e ha trovato un InnerException: SocketException. in la traccia di svclog.

Dopo aver cercato nel registro eventi di Windows, ho riscontrato un errore proveniente dalla classe System.ServiceModel.Activation.TcpWorkerProcess.

Stai ospitando il servizio wcf in IIS con netTcpBinding e port sharing?

Sembra che ci sia un bug nella funzione di condivisione porto di IIS, controllare la fix:

La mia soluzione è quella di ospitare il vostro servizio WCF in un servizio di Windows.

+0

Questo è per una vecchia versione di IIS, come 6? Dato che la "correzione" è del 2011 e il collegamento per il download è addirittura scomparso ... –

3

Ho lo stesso problema. La mia soluzione è questa:

Se si utilizza Linq2Sql nel progetto, Aprire il file dbml in Visual Studio e cambiare la modalità di serializzazione di "unidirezionale", a

3

Dopo aver tirato fuori i miei capelli per come 6 ore di questa del tutto inutile errore, il mio problema è stato che il mio data transfer objects era troppo complesso. Inizia con uber semplici proprietà come public long Id { get; set;} che è ... niente di speciale.

+1

Il mio oggetto aveva un riferimento ricorsivo. –

2

Il problema che avevo era anche con la serializzazione. La causa erano alcune delle mie DTO/business class e le proprietà sono state rinominate o eliminate senza aggiornare il riferimento del servizio. Sono sorpreso di non aver ricevuto il contract filter mismatch error. Ma l'aggiornamento del servizio ref risolto l'errore per me (stesso errore di OP).

2

Nel mio caso era anche con la serializzazione. Devo aggiungere [KnownType(typeof(...)] per tutte le classi che potrebbero apparire nella serializzazione.

7

Ho trovato che è possibile ottenere questo errore se l'oggetto restituito contiene solo proprietà auto inizializzate nel costruttore (con sintassi C# 6.0).

Credo che questo sia dovuto alla deserializzazione di WCF sul lato client utilizzando un costruttore parametrico e quindi all'impostazione delle proprietà sull'oggetto. Deve avere un setdisponibile (può essere privato) per riempire l'oggetto, altrimenti fallirà.

+0

O .... Mio .... Dio .... grazie mille per questa risposta. Mi chiedo perché questo non è menzionato o catturato al momento della compilazione. – DdW

Problemi correlati