2011-03-15 15 views
11

Tengo un servicio WCF simple que ha funcionado bien mientras he estado probando en mi máquina de desarrollo.WCF Web Service error: "¿El enlace del punto final del servicio no utiliza el protocolo HTTP?"

Ahora he movido el servicio web a un servidor web, y estoy ejecutando el servicio (en modo de depuración) en http://mydomain.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:

An error occurred while receiving the HTTP response to http://mydomain.com:8005/ . 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.

más pistas: la firma de 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 voltear?

+0

¿Cómo hospedas tu servicio WCF? En IIS? ¿IIS se ejecuta en el puerto 8005 en esa máquina? También: por favor ** muéstranos ** tu configuración del lado del servicio - no podemos leer tu mente (o tu disco duro) desde aquí ... –

+1

WCF también necesita tener ** clases concretas ** para pasar datos (ya que todo necesita ser XML-serializable y debe ser capaz de expresarse en esquema XML; las interfaces no son adecuadas).Creo que no podrá volver a pasar un 'IEnumerable ' - intente utilizar una 'Lista ' o un tipo concreto en su lugar. ¿Alguna suerte? –

+1

@marc_s - autohospedado, marcado como '[Serializable]' y '[DataContract]'; todos los miembros públicos marcados como '[DataMember]'. –

Respuesta

21

WCF también debe tener clases concretas para pasar datos alrededor (ya que todo tiene que ser XML serializable y debe ser capaz de ser expresado en esquema XML - las interfaces no son adecuadas).

creo que no será capaz de pasar de nuevo una IEnumerable<T> - trate de usar un List<T> (o un T[] matriz) o un tipo concreto en su lugar.

¿Alguna suerte?

+1

Spot on - ¡gracias! –

4

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

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

EDITAR

Aunque no hay nada inherentemente bloqueo [Serializable] hará que su serialización a tal proceso más de lo que puede manejar.

EDIT 2

comentario

de marc_s hecho bien

+1

Está marcado como ' [Serializable] 'y' [DataContract] '; todos los miembros públicos marcados como '[DataMember]'. ¿'' [Serializable] 'hace algún daño, o es simplemente innecesario? –

+0

+1 para indicar que '[Serializable]' no es necesario. –

8

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

<system.web> 
    <httpRuntime maxRequestLength ="262144" executionTimeout="103600"/> 
</system.web> 
+0

También tenía un archivo grande, ya cambié maxRequestLength, pero el executeTimeout hizo el truco. – StefanHa

0

actualización de su entidad si los cambios realizados en las tablas anteriores y no actualizar su entidad también este error se produzca

2

respuesta tarde a la fiesta, pero tengo el mismo error.

Resulta que no puede usar clases abstractas para los miembros del contrato de datos.Tuve que usar el 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 { 

} 

Con el fin de permitir que WCF para serializar algo así como

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

acabo 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.

he cambiado el código para asegurarse de que no había valores nulos y funcionó

0

Sólo se enfrentaron el mismo problema pero fue causado por la seguridad tipo de protocolo codificado a TLS 1.2 mientras que el servicio se implementa 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 este, usted sabe por qué está recibiendo el error ahora:

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

me he enfrentado a la misma cuestión. Era el problema de la dirección del puerto EndpointAddress. En la dirección del puerto de Visual Studio de su archivo (por ejemplo, Service1.svc) y la dirección del puerto de su proyecto wcf debe ser el mismo que usted da en EndpointAddress. Déjame describirte esta solución en detalle.

Hay dos pasos para verificar las direcciones del puerto.

  1. en su proyecto WCF haga clic derecho en el archivo de servicio (por ejemplo Service1.svc) -> seleccione de Ver en el navegador ahora en su navegador tiene URL como http://localhost:61122/Service1.svc por lo que ahora anotar su dirección de puerto como 61122

  2. Rig haga clic en su proyecto WCF -> Propiedades de seleccionar -> ve a la pestaña web -> Ahora en Servidores secció n -> seleccione Utilice Visual Studio Development Server -> seleccione Puerto específico y proporcione la dirección de puerto que hemos encontrado anteriormente de nuestro servicio Service1.svc. Eso es (61122).

Anterior Tengo la dirección de puerto diferente. Después de Especificar la dirección del puerto correctamente que he dado en EndpointAddress, mi problema fue resuelto.

Espero que esto pueda solucionar su problema.

Cuestiones relacionadas