2008-10-15 21 views
21

Me he encontrado con un problema al tratar de devolver un objeto que contiene una colección de childobjects que de nuevo puede contener una colección de objetos nietos. Me sale un error, 'conexión cerrada por la fuerza por el host'.Tipos de datos complejos en WCF?

¿Hay alguna manera de que esto funcione? Actualmente tengo una estructura parecida a esta:

seudo código:

Person: 
IEnumerable<Order> 

Order: 
IEnumerable<OrderLine> 

Los tres objetos tienen el atributo DataContract y todas las propiedades públicas que quiero expuesta (incluido el IEnumerable de) tener el atributo DataMember.

Tengo varios OperationContract en mi servicio y todos los métodos que devuelven un solo objeto O un IEnumerable de un objeto funcionan perfectamente. Es solo cuando intento anidar IEnumerable que se vuelve malo. También en mi referencia de servicio al cliente elegí la lista genérica como mi tipo de colección. Solo quiero enfatizar, , solo una de mis operaciones/métodos falla con este error; el resto de ellos funciona perfectamente.

EDITAR (descripción más detallada de error):

[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.] 

he intentado buscar registros, pero no puedo encontrar ninguna ... También estoy usando un wsHttpBinding y un extremo HTTP.

+0

¿Hay algo en sus objetos que no está serializando correctamente? –

+0

No lo sé. Estaba pensando que tal vez un IEnumberable podría no ser serializado? ¿Pero cómo lo descubro? Puedo depurar todo el camino hasta el retorno del OperationContract real y todo está bien, pero el transporte parece ir mal. No tengo el atributo Serializar, pero en su lugar uso [DataMember] –

+0

, estoy enfrentando el mismo error que ustedes ... mis clases también están definidas con propiedades enum, pero no estoy viendo esto como un problema en ninguna parte ... las enumeraciones deberían estar bien ... y ¿qué quieres decir con establecer el valor predeterminado? son tipos de valor por lo que siempre tienen un valor predeterminado.Voy a tratar de eliminar las propiedades enum y ver si eso lo arregla ... aquí hay algo de información sobre clases de contrato de datos compatibles http://msdn.microsoft.com/en-us/library/ms731923.aspx –

Respuesta

37

Como nota, usted necesita aprender cómo utilizar las utilidades de registro de WCF:

Logging info.

Config Editor (lo hace fácil de configurar).

Trace viewer. Totalmente impresionante. Permite rastrear múltiples servicios (cliente y servidor) y puede unirlos y ayudarlo a analizar todos los detalles. Le permite llegar a la raíz de los problemas realmente rápido. (Porque cuando hay un error WCF en el servidor, es poco probable que el cliente obtenga datos útiles.)

+0

¿Dónde puedo encontrar la aplicación de visor de seguimiento, MS? la documentación habla de ello, pero no hay referencias sobre cómo comenzar a usarlo? –

+1

JL, está instalado con Windows SDK –

+0

+1 para Trace Viewer ... ¡realmente es una herramienta increíble! Acabo de resolver un problema para mí que había estado dando vueltas desde ayer. – w4ik

0

¿especificó en su configuración de comportamiento del servicio? parece que falta información en esta stacktrace.

puede obtener la excepción en el lado del servidor (por ejemplo, en el modo de depuración de Visual Studio o con una biblioteca de registro como log4net).

¿Ha intentado llamar a otros métodos (helloworld simple() por ejemplo) en el mismo servicio para asegurarse de que la configuración del servicio en sí funciona? este tipo de exceptino también podría indicar algunos problemas de serialización. ¿Qué tipos quieres enviar por cable? usas KnownType en alguna parte?

+0

Estoy muy contento por todo la ayuda que puedo obtener, ¡así que gracias por responder !, pero vuelve a leer mi pregunta: solo uno de mis métodos falla con este error. También sobre la excepción, puedo publicar la stacktrace completa, pero simplemente hincha la pregunta. Lo publicaré en una respuesta, entonces :) –

0
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 
1

esta es en realidad la misma información que su primera descripción de excepción. sería interesante cuál fue la causa original de la excepción de socke. tiene que haber algún tipo de error en el servicio en sí. ¿Puedes localizar dónde ocurre exactamente la excepción whar?

tuve errores similares al tratar de devolver normal IEnumerables que fueron sobrescritos (fueron marcados como virtuales) por NHibernate, y sustituidos por GenericPersistentBag, que no es serializable. ¿Ha marcado sus miembros de IEnumerable como virtuales debido a nhibernate o algo similar? esto podría explicar tu error.

btw. wcf excepciones a menudo son bastante sin sentido (lo que puede ser muy frustrante cuando se rastrea un error;)

+0

Esa es toda la información de excepción que puedo obtener. Obtengo la misma excepción (si incluyo el stacktrace) cuando depuro. Estamos utilizando Linq2Sql, pero en realidad convertimos esos objetos en objetos más livianos que solo contienen tipos de datos simples, con la excepción de estas colecciones anidadas. –

+0

Lo que quiero decir es que los objetos que tienen DataContract en ellos no son parte de ninguna otra cosa en el proyecto; son prácticamente DTO con la excepción de tener colecciones de otros "DTO" –

11

Ok, finalmente encontré el verdadero problema en mi caso. Parece que exponer enums no es lo mejor del mundo. O bien tengo que establecer un valor predeterminado en ellos, o en su lugar exponer la propiedad como int o cualquier tipo de entero en el que se base mi enum.

Gracias por ayudarme, no tenías manera de saber esto: encontré las enumeraciones en el 3er nivel en mi estructura y sistemáticamente eliminé los miembros de datos uno por uno, fue la forma en que me enteré.Parece que no soy el único que se encontró con este problema - este tipo obviamente tenía problemas similares :)

http://zianet.dk/blog/2007/11/24/serializing-enums-in-wcf/

0

No sé por qué puede suceder esto. pero también tuve problemas similares.

He cambiado mis enums.remove los índices (por ejemplo, ASNOrder = 1, -> ASNOrder,), y no se ha producido ningún error.

1

He tenido el mismo problema también (.Net 3.5). Resulta que mi clase base DataContract faltaba un tipo conocido. Es desafortunado que el error de WCF no sea más descriptivo.

3

Añadir esta línea en <system.web/>:

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

Me salvó. ¡Gracias! – wcm

0

Sí, tuve el mismo problema aquí y fue TODO con devolver objetos que tenían valores de enum. Cambió el DataMember a un int y todo está funcionando.

0

Pruebe la configuración [OperationBehavior()] anterior a su implementación del método de interfaz.

0

He tenido este error cuando uso 'yield return' para crear una enumeración de objetos asignados a mi tipo DataContract.

Llamar a ToList/ToArray en los resultados de rendimiento solucionó el problema y la llamada de servicio funcionó correctamente.

10

Si está trabajando con WCF + (EF + POCO) y luego intente configurar,

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

Muchas gracias. ¡Me salvaste de dispararme a mí mismo! – Dragan

+0

O usa 'AutoMapper', en cuyo caso evitas resolver solo los síntomas. –

3

enumeraciones conseguir un atributo DataContract, como cualquier clase haría, pero no se supone que los valores de enumeración tener DataMember atributos de ellos.

Cámbialos a EnumMember y dejará de obtener este error inescrutable.

+0

Este hizo el truco: D –

Cuestiones relacionadas