#HowTo Resolver error «An error occurred while receiving the HTTP response» en Wcf.

En este post voy a explicar algunas de las causas del mensaje de error:  «An error occurred while receiving the HTTP response» que pueden serte útiles si tienes este problema.

Contexto del error.

Estoy migrando algunos de mis DataContracts de clases a structs por motivos de optimización en la memoria. Al momento de hacer la conexión con el cliente al servicio obtuve el siguiente mensaje de error:

An error occurred while receiving the HTTP response to 'xxxx'. 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.

Inner Exception:
The underlying connection was closed: An unexpected error occurred on a receive.
Inner Exception:
Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.

Inner Exception:
An existing connection was forcibly closed by the remote host

Descarte la configuración de los bindings, un fallo en los servicios o errores de IIS.

¿Qué ocasiona este error?.

Este error es ocasionado por un fallo en la creación de una instancia por reflexión o en problemas de serialización del DataContract.

¿Qué debo revisar?.

  • Si ocupas structs en tus DataContracts remueve las sobrecargas de constructores, el compilador crea constructores por defecto en las structs,  si declaras una sobrecarga el serializador de Wcf será incapaz de encontrar el constructor sin parámetros lo que ocasionara un error.
  • Verifica que todas las propiedades requeridas por el DataContract tengan el atributo [DataMember], en el caso de que tengas propiedades que no deban ser serializadas coloca el atributo [IgnoreDataMember].
  • No ejecutes ningún tipo de validación o aserción en el constructor sin parámetros. El constructor debe de tener la menor lógica posible sin ningún tipo de excepción.
  • Declara un constructor sin parámetros en tus clases. Todo DataContract debe tener constructor sin parámetros, es fácil agregar una sobrecarga de constructor sin darte cuenta, lo que te puede dar dolores de cabeza más adelante.
  • Comprueba que los objetos complejos declarados dentro de tus DataContracts también tengan los atributos [DataContract] y [DataMember].

Referencias:

Gustavo Sánchez

Soy especialista en escribir software de calidad. Mediante el uso de marcos de trabajo, técnicas y automatización de procesos he podido reducir los costes operativos de los sistemas de la empresa. Sistemas confiables y adaptables producen clientes felices.