2010-04-19 16 views
15

Tengo un servicio web que devuelve datos a la aplicación de escritorio. El problema que tengo es que cuando el servicio web devuelve un pequeño volumen de datos, todo funciona bien, pero cuando el volumen de datos es grande arroja la siguiente excepción:Método WCF llamado dos veces

System.Net.WebException: La conexión subyacente estaba cerrada: error inesperado en una recepción.

Y cuando estoy depurando el servicio web, veo que este método en particular se llama dos veces. Ejecuta la declaración de devolución la primera vez que no ocurre nada, pero cuando lo ejecuta por segunda vez, se lanza la excepción mencionada anteriormente en la aplicación de escritorio.

Encontré publicaciones similares anteriormente en stackoverflow pero no solucionaron mi problema. ¿Alguien puede decirme qué está pasando aquí?

Gracias!

+0

¿Recibe esta excepción en el cliente o en el servidor? Creo que está en el cliente.En ese caso, debe buscar en el registro de eventos de Windows para ver qué sucede en el servidor. También puede activar el seguimiento de WCF para ver qué sucede en el servicio. –

+0

No hay nada en el registro de eventos de Windows para esta excepción. ¿Podría ayudarme a rastrear el servicio web? Nunca he hecho eso antes. Incluso si pudiera enviarme un enlace para el rastreador, sería de gran ayuda. Gracias –

Respuesta

12

Podría ser porque el tamaño del mensaje es mayor que el tamaño del mensaje predeterminado. Puede probar increasing the this value en la configuración del punto final. También puedes echar un vistazo al this post.


ACTUALIZACIÓN:

para diagnosticar el problema que sugeriría que la activación de la traza en el servicio, colocando lo siguiente en el fichero de configuración:

<system.diagnostics> 
    <trace autoflush="true"> 
    </trace> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
      <listeners> 
       <add name="sdt" 
        type="System.Diagnostics.XmlWriterTraceListener" 
        initializeData="WcfDetailTrace.e2e" /> 
      </listeners> 
     </source> 
    </sources> 
</system.diagnostics> 

Esto generará la traza WcfDetailTrace.e2e archivo que puede abrir con el Service Trace Viewer Tool que le proporcionará amplia información sobre la llamada y el mensaje de error.

+0

El tamaño no es el problema. Estoy configurando el tamaño a 16 MB y los datos que se transfieren son menores que eso. Ya miré las dos publicaciones mencionadas, pero no pareció ayudar. ¿Alguna otra sugerencia, por favor? Gracias .. –

+1

@Saurabh, por favor mira mi actualización. –

+1

@DarinDimitrov Este me salvó la vida y el proyecto, no pude entender qué estaba mal. Se encuentra en el rastreo que EF-Entity no es un contrato de datos. ¡Gracias! :) – Hitin

6

Recientemente tuve este problema.

Resultó que al analizar el registro de WCF tal como lo había escrito System.Diagnostics.XmlWriterTraceListener se produjo un problema con el contrato de datos que había configurado.

Estoy volviendo Dictionary<int, object> (Nota al margen: Sí, sé que esto es realmente malo !, pero soy joven y necesito el dinero). Se me olvidó incluir el atributo [KnownType] en el valor de retorno para el DataContract:

[DataContract] 
    [KnownType(typeof(Dictionary<int, double>))] 
    [KnownType(typeof(Dictionary<int, ChannelData>))] 
    [KnownType(typeof(Dictionary<string, Dictionary<int, double>>))] 
    public class MyCoolObject: ICoolObject 
    { 
[DataMember] 
     public Dictionary<string, object> Results 
     { 
      get { return _results; } 
      set { _results = value; } 
     } 
    } 
1

Recientemente tuve este problema, y ​​resultó que he olvidado de marcar una de las clases de transferencia de datos con [DataContract]

5

Yo también tuve este problema. Para mí, estaba sucediendo porque tenía una propiedad [DataMember] con get{} pero no set{}. Después de agregar un set{}, este comportamiento se detuvo.

+0

¡Muchas gracias! Esto resolvió mi problema. No entiendo por qué eso lo afecta. – Husain

+0

Hola, también estoy enfrentando el mismo problema con un get {} pero sin un set {}. lo que esa propiedad realmente significa es que la propiedad vo – Veeresh123

1

Encontré este mismo problema. Resultó que WCF no podía devolver DateTime como JSON, así que tuve que hacerlo Nullable<DateTime>.

1

También tuve este problema y mi solución fue similar a la de Batgar, pero con un giro. Tenía una clase que tenía una propiedad del tipo object. Tuve que agregar atributos KnownType a la clase para cada tipo que pudiera contener el objeto. No pude poblar el KnownType sobre la marcha ya que la clase no sabía lo que el objeto contendrá.

Cuestiones relacionadas