Pergunta

eu correr em um problema ao tentar retornar um objeto que contém uma coleção de childobjects que novamente pode conter uma coleção de objetos neto. Eu recebo um erro, 'conexão forçosamente fechada pelo host'.

Existe alguma maneira de fazer este trabalho? Actualmente tenho uma estrutura semelhante a esta:

código pseudo:

Person:
IEnumerable<Order>

Order:
IEnumerable<OrderLine>

Todos os três objetos têm o atributo DataContract e todas as propriedades públicas que eu quero exposta (incluindo o de IEnumerable) tem o atributo DataMember.

Eu tenho múltiplos OperationContract de no meu serviço e todos os métodos que retornam um único objeto ou um IEnumerable de um objeto funciona perfeitamente. É só quando eu tento ninho IEnumerable que se torna ruim. Também na minha referência de serviço cliente i escolheu a lista genérica como o meu tipo de coleção. Eu só quero enfatizar, apenas uma das minhas operações / métodos falhar com este erro -. O resto deles funcionam perfeitamente

EDIT (descrição de erro mais detalhada):

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

Eu tentei olhar para os logs, mas não consigo encontrar qualquer ... também eu estou usando um WSHttpBinding e http endpoint.

Foi útil?

Solução

Como uma nota, você precisa aprender a usar os utilitários de registro WCF:

Logging info.

Config Editor (torna uma pressão para configurar).

Trace Viewer. Totalmente incrível. Permite que vários serviços (cliente e servidor) para rastrear e pode juntá-los e ajudá-lo a analisar todos os detalhes. Permite chegar à raiz das questões muito rápido. (Porque quando há um erro de WCF servidor, o cliente é improvável que se obtenha dados úteis para fora.)

Outras dicas

Ok eu finalmente encontrado o verdadeiro problema no meu caso. Parece expondo enums não é a melhor coisa do mundo. Ou eu tenho que definir um valor padrão para eles, ou em vez expor a propriedade como um int ou qualquer inteiro de digitar meu enum é baseado.

Obrigado por ajudar, você não tinha como saber isso - eu encontrei os enums no nível 3 na minha estrutura e systematicly remoção DataMembers um por um foi a maneira que eu encontrei para fora. Parece que eu não sou o único que correu para este problema - esse cara obviamente teve problemas semelhantes:)

http://zianet.dk/blog/ 2007/11/24 / serialização-enums-em-WCF /

Se você estiver trabalhando com o WCF + (EF + POCO), em seguida, tente definir,

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

Adicione esta linha em <system.web/>:

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

Enums obter um atributo DataContract, como qualquer classe seria, mas os valores de enumeração não são suposto ter atributos DataMember sobre eles.

mudá-los para EnumMember e você vai parar de receber este erro inescrutável.

este é realmente a mesma informação que a sua primeira descrição da exceção. seria interesing o que a causa original para o SocketException era. ele tem que ser algum tipo de erro no próprio serviço. você pode localizar exatamente onde exceção whar acontece?

i teve erros semelhantes ao tentar retornar IEnumerables normais que foram sobrescritos (eles foram marcados como virtual) por NHibernate, e substituido com GenericPersistentBag, que não é serializável. você marcou seus DataMembers IEnumerable como virtual devido à NHibernate ou algo semelhante? isso poderia explicar o seu erro.

btw. wcf exceções são muitas vezes bastante sem sentido (que pode ser muito frustrante quando rastrear um bug;)

Eu tive o mesmo problema também (Net 3.5). Acontece que meu DataContract classe base estava faltando um tipo conhecido. É lamentável que o erro WCF não era mais descritivo.

que você especificar no seu serviço de comportamento de configuração? parece que alguma informação está faltando neste stacktrace.

Você pode pegar a exceção no lado do servidor (por exemplo, no modo de estúdio de depuração visual ou com uma biblioteca de log como log4net).

você já tentou chamar alguns outros métodos (simples helloworld (por exemplo)) sobre o mesmo serviço para ter certeza de que a própria configuração do serviço funciona? este tipo de exceptino também pode indicar alguns problemas de serialização. quais os tipos que você deseja enviar sobre o fio? você usa algum lugar do KnownType?

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 

Eu não sei por que isso pode acontecer. mas eu também tinha problemas semelhantes.

Mudei enums.remove os índices (por exemplo ASNOrder = 1, -.> ASNOrder,)., E nenhum erro occoured

não devolver o IEnumerable literal em um contrato, há o famoso WCF IEnumerable bug

Tente configurar [OperationBehavior()] acima de sua implementação do método de interface.

Eu tive esse erro ao usar o retorno de rendimento "para construir uma enumeração de objetos mapeados para o meu tipo DataContract.

Chamando ToList / ToArray nos resultados de rendimento corrigido o problema e o serviço de chamada funcionou corretamente.

Sim, eu tive o mesmo problema aqui e foi TODO com o retorno objetos que tinham valores enum nele. Mudou o DataMember para um int e tudo statrted trabalhando.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top