Error del servicio web de WCF: “¿Enlace de punto final de servicio que no utiliza el protocolo HTTP”?

Tengo un servicio simple de WCF que ha funcionado bien mientras he estado probando en mi máquina dev.

Ahora moví el servicio web a un servidor web, y estoy ejecutando el servicio (en modo de depuración) en http://mydomain.com:8005 . Al abrir un navegador web para esa URL se muestra la página de servicio esperada, y si coloco un punto de interrupción en el servidor dentro de la interfaz a la que llamo, llega al punto de interrupción y devuelve los datos esperados … pero en el lado del cliente regresa con el siguiente error:

Se produjo un error al recibir la respuesta HTTP a http://mydomain.com:8005/ . Esto podría deberse a que el enlace del punto final del servicio no utiliza el protocolo HTTP. Esto también podría deberse a que el servidor haya abortado un contexto de solicitud HTTP (posiblemente debido a que el servicio se haya cerrado). Ver los registros del servidor para más detalles.

Más pistas: la firma de la interfaz es:

IEnumerable GetThings(out string errMsg); 

donde MyClass se define como Serializable, y las definiciones son idénticas entre cliente y servidor.

¿Alguna idea de qué interruptores secretos necesito voltear?

WCF también necesita tener clases concretas para pasar datos (ya que todo debe ser serializable por XML y debe ser capaz de expressse en un esquema XML, las interfaces no son adecuadas).

Creo que no podrá devolver un IEnumerable ; intente usar una List (o una matriz T[] ) o un tipo concreto en su lugar.

¿Alguna suerte?

Tuve el mismo problema porque estaba devolviendo una gran cantidad de registros desde el servidor, agregué la siguiente línea a mi archivo de configuración wcf y funcionó.

    

No defina MyClass como Serializable. Marque como [DataContract] y sus propiedades como [DataMember].

Si no puedes, bueno … creo que también he visto esa pregunta por aquí.

EDITAR

Si bien no hay nada que bloquee de forma inherente [Serializable], su serialización tal vez procese más de lo que puede manejar.

Editar 2

El comentario de marc_s lo hizo bien

Última respuesta a la fiesta, pero tengo el mismo error.

Resulta que no se pueden usar clases abstractas para los miembros del contrato de datos. Tuve que usar lo siguiente:

 [DataContract] public class MyClass { [DataMember] public A MyProperty { get; set; } } [DataContract] [KnownType(typeof(B))] [KnownType(typeof(C))] public class A { } [DataContract] public class B : A { } [DataContract] public class C : A { } 

Para permitir que WCF serialice algo como

 var myClass = new MyClass(); myClass.MyProperty = new B(); 

Actualice su Entidad si algún cambio realizado en sus tablas anteriores y no actualizó su entidad también se producirá este error

Acabo de dejar esto aquí por si alguien lo necesita. Me encontré con el mismo error. Estaba llamando a mi servicio, que tiene un argumento del tipo Dictionary y uno de los pares clave / valor tenía el valor de cadena establecido en nulo.

Cambié el código para asegurarme de que no había valores nulos y funcionó

Simplemente enfrenté exactamente el mismo problema, pero fue causado por un tipo de protocolo de seguridad codificado de forma rígida a TLS 1.2 mientras que el servicio se implementó en el servidor 2008 sin R2 (y 32 bits para iniciar, lo que significa que no se puede actualizar a R2).

Este es un escenario muy poco probable para cualquier otra persona, pero pensé que lo mencionaría.

Si alguien se encuentra en la misma situación y tiene una línea de código como esta, sabe por qué está recibiendo el error ahora:

 System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; 

He enfrentado el mismo problema. Fue el tema de la dirección del puerto de EndpointAddress . En Visual Studio, la dirección de puerto de su archivo (por ejemplo, Service1.svc) y la dirección de puerto de su proyecto de wcf deben ser las mismas que le da a EndpointAddress . Déjame describirte esta solución en detalle.

Hay dos pasos para verificar las direcciones de los puertos.

  1. En su Proyecto WCF, haga clic con el botón derecho en su archivo de Servicio (por ejemplo, Service1.svc) -> luego de seleccionar Ver en el navegador ahora en su navegador, tiene url como http: // localhost: 61122 / Service1.svc, así que anote su dirección de puerto como un 61122

  2. Haga clic derecho en su proyecto wcf -> que seleccione Propiedades -> vaya a la pestaña Web -> Ahora en la sección Servidores -> seleccione Usar Visual Studio Development Server -> seleccione Puerto específico y proporcione la dirección de puerto que hemos encontrado anteriormente en nuestro Servicio1. servicio de svc. Eso es (61122) .

Antes tengo diferente dirección de puerto. Después de especificar correctamente la dirección del puerto que he dado en EndpointAddress , mi problema se resolvió.

Espero que esto se pueda resolver su problema.