2009-02-13 7 views
38

He desarrollado un servicio WCF que usa el adaptador net.tcp y escucha un puerto específico. Quiero conectarme a ese servicio utilizando un cliente .NET normal que usa conectores para enviar datos al puerto y escuchar las respuestas.
Cuando trato de enviar datos a este servicio, aparece el error: "La conexión existente fue cerrada a la fuerza por el host remoto".
Sin embargo, puedo conectarme con el servicio por otro cliente que usa la dirección/vinculación/contratos del servicio WCF.
¿Hay alguna manera que me permita comunicarme con un servicio WCF usando un cliente basado en socket ordinario?¿Cómo usar el cliente basado en socket con el servicio WCF (net.tcp)?

+0

Para asegurarse de que todos entienden lo que intenta hacer aquí ... ¿Podría aclarar si está intentando utilizar la función de programación de sockets incorporados dentro de .NET para conectarse a un servicio Net.Tcp WCF y viceversa? –

+0

EnocNRoll, tienes toda la razón. Estoy tratando de usar un cliente basado en socket para comunicar un servicio WCF basado en net.tcp. – Burhan

Respuesta

48

La decisión clave es si hacer que el servicio WCF se ajuste al cliente de socket o si hacer que el cliente de socket se conforme al servicio WCF.

Será más simple intentar ajustarse al servicio WCF, en lugar de tratar de implementar algo personalizado en WCF, que nunca es fácil. En la parte inferior de la sección Otros recursos a continuación, verá un enlace que describe la inspección de mensajes que es necesaria para intentar ajustarse a un servicio WCF.

Dicho esto, los conectores .NET no se comunican de forma nativa con WCF.

Cualquier intento de hacerlo requerirá una programación personalizada en el lado WCF.

Si está utilizando TcpClient o sockets sin procesar en .NET para conectarse y comunicarse con WCF no importa. Cualquier interoperabilidad de este tipo debe ser manejada con lógica personalizada dentro de WCF. Tenga en cuenta que Net.Tcp es un protocolo de transporte personalizado. Técnicamente no se usa TCP de la misma manera que el TcpClient.

Por ejemplo, UDP es muy comúnmente utilizado por los servidores de socket en el mundo de Linux. WCF no proporciona un transporte UDP incorporado. Sin embargo, hay una muestra UDP para WCF que implementa UDP para WCF. Desafortunadamente, esa muestra no ilustra la comunicación hacia y desde un servidor de socket UPD que no es WCF.

Tengo una cuestión pendiente que es bastante detallado donde explico mi esfuerzo para obtener el código de ejemplo para ser comprobable de forma genérica para el uso de la UDP ...

Is it possible to make the WcfTestClient work for custom transport channels?

Nadie ha respondido a mi pregunta todavía. Entonces, si logras que esto funcione, estoy muy interesado. Mi caso fue impulsado por el deseo de que el Servicio WCF pueda llamar a un servidor de socket UDP que se ejecuta en Linux sin tener que saturar mi servicio con una codificación que no sea WCF. No quiero mezclar enfoques.

Otros recursos ...

+10

Mi respuesta definitivamente no merece ser downvoted. –

+2

pero usted criticó la maravillosa WCF, por lo tanto, debe ser sacado y disparado :). Sin embargo, tengo +1 de parte mía. – gbjbaanb

+1

Gracias, trato de hacer que mi respuesta sea útil y siempre las actualizo si son incorrectas de alguna manera. Los veo como referencias para mi conocimiento personal también, no simplemente para los puntos en StackOverflow. –

0

Hy,

no le permiten el rastreo de WCF? Porque si lo hace, recibirá el siguiente mensaje: "El servicio no le permite iniciar sesión de forma anónima". entonces es (por lo general) un problema de configuración de seguridad.

En este caso desactivar el modo de seguridad para su unión:

<netTcpBinding> 
    <binding name="MyCustomBinding"> 
     <security mode="None" /> 
    </binding> 
</netTcpBinding> 

Pero mejor sería trabajar con certificados.

6

El Net.TCP vinculante utiliza un formato de trama a nivel de cable personalizado que no está muy documentado, aunque Nicholas Allen comenzó una serie de publicaciones en el blog sobre el tema recientemente. La serie comienza aquí: http://blogs.msdn.com/drnick/archive/2009/01/19/message-framing-part-1.aspx

Para ser honesto, Net.TCP es realmente, actualmente, más útil para la comunicación WCF a WCF. Si desea interoperar con un formato TCP personalizado que necesita manejar, es mucho mejor que usar sockets sin procesar o crear su propio canal de transporte WCF personalizado (que podría no ser trivial, por cierto)

+1

Está bien documentado, ver [MC-NMF] .NET Message Framing Protocol Specification. – Soonts

Cuestiones relacionadas