c# - respuesta - Error del servicio web de WCF: "¿El enlace del punto final del servicio no utiliza el protocolo HTTP?
communicationexception error al recibir la respuesta http (8)
Tengo un servicio WCF simple que funcionó bien mientras estaba probando en mi máquina de desarrollo.
Ahora he movido el servicio web a un servidor web y estoy ejecutando el servicio (en modo de depuración) en http://midominio.com:8005 . Abrir un navegador web a esa URL muestra la página de servicio esperada, y si pongo un punto de interrupción en el servidor dentro de la interfaz que estoy llamando, llega al punto de interrupción y devuelve los datos esperados ... pero en el lado del cliente vuelve 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 ha cancelado un contexto de solicitud HTTP (posiblemente debido a que el servicio se ha apagado). Vea los registros del servidor para más detalles.
Más pistas: la firma de la interfaz es:
IEnumerable<MyClass> GetThings(out string errMsg);
donde MyClass
se define como Serializable, y las definiciones son idénticas entre el cliente y el servidor.
¿Alguna idea de qué cambios secretos necesito para cambiar?
No defina MyClass como Serializable. Marque como [DataContract] y sus propiedades como [DataMember].
Si no puedes, bueno ... creo que he visto esa pregunta por aquí también.
EDITAR
Si bien no hay nada inherentemente bloqueando [Serializable], su serialización quizás procesará más de lo que puede manejar.
EDIT 2
El comentario de marc_s lo hizo bien
WCF también necesita tener clases concretas para pasar datos (ya que todo debe ser XML-serializable y debe poder expresarse en esquema XML; las interfaces no son adecuadas).
Creo que no podrá volver a pasar un IEnumerable<T>
; intente usar una List<T>
(o una matriz T[]
) o un tipo concreto.
¿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ó.
<system.web>
<httpRuntime maxRequestLength ="262144" executionTimeout="103600"/>
</system.web>
Actualice su Entidad si los cambios realizados en sus tablas anteriores y no actualizó su entidad también se producirá este error
Última respuesta a la fiesta, pero obtuve el mismo error.
Resulta que no puede usar clases abstractas para miembros de 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 así como
var myClass = new MyClass();
myClass.MyProperty = new B();
Solo dejo 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<int, string>
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ó
Acabo de enfrentar exactamente el mismo problema, pero fue causado por el tipo de protocolo de seguridad codificado en TLS 1.2
mientras que el servicio se implementó en el servidor 2008 sin R2 (y 32 bits para arrancar, lo que significa que no se puede actualizar a R2).
Este es un escenario muy poco probable para cualquier otra persona, pero pensé que mencionaría.
Si alguien está en la misma situación y tiene una línea de código como esta, ya sabe por qué está recibiendo el error:
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
He enfrentado el mismo problema. Era el problema de la dirección del puerto de EndpointAddress . En Visual Studio, la dirección del puerto de su archivo (p. Ej., Service1.svc) y la dirección del puerto de su proyecto wcf deben ser las mismas que las que proporciona a EndpointAddress . Déjame describirte esta solución en detalle.
Hay dos pasos para verificar las direcciones del puerto.
En su proyecto WCF haga clic derecho en su archivo de servicio (por ejemplo, Service1.svc) -> luego seleccione Ver en el navegador ahora en su navegador tiene url como http: // localhost: 61122 / Service1.svc por lo que anote la dirección de su puerto como a 61122
Haga clic derecho en su proyecto wcf -> luego seleccione Propiedades -> vaya a la pestaña Web -> Ahora en la sección Servidores -> seleccione Usar servidor de desarrollo Visual Studio -> seleccione Puerto específico y proporcione la dirección de puerto que hemos encontrado anteriormente de nuestro Servicio1. servicio de svc Eso es (61122) .
Antes tengo una dirección de puerto diferente. Después de especificar correctamente la dirección del puerto que he dado en EndpointAddress , mi problema fue resuelto.
Espero que esto solucione tu problema.