Domanda

Ho riscontrato un problema nel tentativo di restituire un oggetto che contiene una raccolta di oggetti figlio che può contenere una raccolta di oggetti nipoti. Viene visualizzato un errore "Connessione forzatamente chiusa dall'host".

C'è un modo per farlo funzionare? Attualmente ho una struttura simile a questa:

pseudo codice:

Person:
IEnumerable<Order>

Order:
IEnumerable<OrderLine>

Tutti e tre gli oggetti hanno l'attributo DataContract e tutte le proprietà pubbliche che voglio esporre (incluso IEnumerable) hanno l'attributo DataMember.

Ho più OperationContract sul mio servizio e tutti i metodi che restituiscono un singolo oggetto O un IEnumerable di un oggetto funziona perfettamente. È solo quando provo a nidificare IEnumerable che diventa cattivo. Anche nel mio riferimento al servizio clienti ho scelto l'elenco generico come tipo di raccolta. Voglio solo sottolineare che solo una delle mie operazioni / metodi fallisce con questo errore - il resto funziona perfettamente .

EDIT (descrizione dell'errore più dettagliata):

[SocketException (0x2746): An existing connection was forcibly closed by
the remote host]
[IOException: Unable to read data from the transport connection:
An existing connection was forcibly closed by the remote host.]
[WebException: The underlying connection was closed: An unexpected
error occurred on a receive.]
[CommunicationException: An error occurred while receiving the HTTP
response to http://myservice.mydomain.dk/MyService.svc. This could
be due to the service endpoint binding not using the HTTP protocol.
This could also be due to an HTTP request context being aborted by
the server (possibly due to the service shutting down). See server
logs for more details.]

Ho provato a cercare i log ma non riesco a trovarne ... inoltre sto usando un WSHttpBinding e un endpoint http.

È stato utile?

Soluzione

Come nota, è necessario imparare come utilizzare le utilità di registrazione WCF:

Informazioni sulla registrazione.

Config Editor (semplifica l'installazione).

Visualizzatore di tracce. Totalmente fantastico. Consente a più servizi (client e server) di tracciare e può unirsi a loro e aiutarti ad analizzare tutti i dettagli. Ti permette di arrivare alla radice dei problemi molto velocemente. (Causa in caso di errore WCF del server, è improbabile che il client ottenga dati utili.)

Altri suggerimenti

Ok, ho finalmente trovato il vero problema nel mio caso. Sembra che esporre enum non sia la cosa più grande del mondo. O devo impostare un valore predefinito su di essi, oppure esporre invece la proprietà come int o su qualsiasi tipo intero su cui si basa il mio enum.

Grazie per l'aiuto, non hai avuto modo di saperlo: ho trovato gli enum al 3 ° livello nella mia struttura e rimuovere sistematicamente i dati uno per uno era il modo in cui l'ho scoperto. Sembra che io non sia l'unico che ha riscontrato questo problema - questo ragazzo ovviamente ha avuto problemi simili :)

http://zianet.dk/blog/ 2007/11 / 24 / serializzazione-enumerazioni-in-WCF /

Se stai lavorando con WCF + (EF + POCO), prova a impostare,

ObjectContext.ContextOptions.LazyLoadingEnabled = false;
ObjectContext.ContextOptions.ProxyCreationEnabled = false;

Aggiungi questa riga in <system.web/>:

<httpRuntime maxRequestLength="102400" executionTimeout="3600" />

Gli Enum ottengono un attributo DataContract, come farebbe qualsiasi classe, ma i valori di enum non dovrebbero avere DataMember attributi su di essi.

Modificali in EnumMember e smetterai di ricevere questo errore imperscrutabile.

si tratta in realtà delle stesse informazioni della prima descrizione dell'eccezione. sarebbe interesare quale fosse la causa originale dell'eccezione del sockete. deve essere un tipo di errore nel servizio stesso. riesci a individuare dove si verifica esattamente l'eccezione whar?

Ho riscontrato errori simili nel tentativo di restituire IEnumerables normali che sono stati sovrascritti (erano contrassegnati come virtuali) da NHibernate e sostituiti con GenericPersistentBag, che non è serializzabile. hai contrassegnato i tuoi datamembri IEnumerable come virtuali a causa di negligenza o qualcosa di simile? questo potrebbe spiegare il tuo errore.

btw. Le eccezioni di wcf sono spesso piuttosto insignificanti (il che può essere molto frustrante quando si rintraccia un bug;)

Ho avuto anche lo stesso problema (.Net 3.5). Si scopre che nella mia classe base DataContract mancava un tipo noto. È un peccato che l'errore WCF non sia stato più descrittivo.

hai specificato nella configurazione del comportamento del tuo servizio? sembra che manchino alcune informazioni in questo stacktrace.

puoi prendere l'eccezione sul lato server (ad es. in modalità debug di Visual Studio o con una libreria di registrazione come log4net).

hai provato a chiamare altri metodi (semplice helloworld () ad esempio) sullo stesso servizio per essere sicuro che la configurazione del servizio stesso funzioni? questo tipo di exclino potrebbe anche indicare alcuni problemi di serializzazione. quali tipi vuoi inviare via filo? usi KnownType da qualche parte?

Server Error in '/' Application.
--------------------------------------------------------------------------------

An existing connection was forcibly closed by the remote host 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[SocketException (0x2746): An existing connection was forcibly closed by the remote host]
   System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) +93
   System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) +119

[IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.]
   System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) +267
   System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size) +25
   System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead) +306

[WebException: The underlying connection was closed: An unexpected error occurred on a receive.]
   System.Net.HttpWebRequest.GetResponse() +1532114
   System.ServiceModel.Channels.HttpChannelRequest.WaitForReply(TimeSpan timeout) +40

[CommunicationException: An error occurred while receiving the HTTP response to http://Zzzstrukturservice.xxx.dk/ZzzstrukturService.svc. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details.]
   System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +2668969
   System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +717
   xxx.Services.ZzzstrukturServiceClient.ZzzstrukturServiceProxy.IZzzstrukturService.GetMatrixSet(Int32 matrixSetId) +0
   xxx.Services.ZzzstrukturServiceClient.ZzzstrukturRepository.GetMatrixSetById(Int32 matrixSetId) in f:\ccnet\work\xxx.Zzzstruktur\1. Presentation Layer\ZzzstrukturServiceClient\ZzzstrukturRepository.cs:90
   xxx.yyy.yyyWeb.AnnoncePage.OnLoad(EventArgs e) in f:\ccnet\work\yyyV2\1. Presentation Layer\yyyWeb\Annonce.aspx.cs:40
   System.Web.UI.Control.LoadRecursive() +47
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436




--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.1433; ASP.NET Version:2.0.50727.1433 

Non so perché questo possa accadere. ma ho anche avuto problemi simili.

Ho cambiato il mio enums.remove gli indici (es. ASNOrder = 1, - > ASNOrder,) e non si sono verificati errori.

Non restituire il valore letterale IEnumerable in un contratto, esiste il famoso Bug IEnumerable WCF

Prova a impostare [OperationBehavior()] sopra l'implementazione del metodo di interfaccia.

Ho riscontrato questo errore durante l'utilizzo di 'yield return' per creare un'enumerazione di oggetti mappati sul mio tipo DataContract.

La chiamata ToList / ToArray sui risultati di rendimento ha risolto il problema e la chiamata di servizio ha funzionato correttamente.

Sì, ho avuto lo stesso problema qui ed era da fare con la restituzione di oggetti che contenevano valori enumerati. Modificato DataMember in un int e tutto ha funzionato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top