Comment utiliser un client basé sur socket avec le service WCF (net.tcp)?

J’ai développé un service WCF qui utilise l’adaptateur net.tcp et écoute un port spécifique. Je souhaite me connecter à ce service à l’aide d’un client .net normal qui utilise des sockets pour envoyer des données au port et écoute les réponses.
Lorsque j’essaie d’envoyer des données à ce service, j’obtiens l’erreur suivante: “La connexion existante a été fermée de force par l’hôte distant”.
Cependant, je suis en mesure de me connecter au service par un autre client qui utilise l’adresse / la liaison / les contrats du service WCF.
Existe-t-il un moyen de communiquer avec un service WCF en utilisant un client basé sur des sockets ordinaire?

La décision clé est de savoir si le service WCF doit ou non être conforme au client socket ou si le client socket doit être conforme au service WCF.

Il sera plus simple d’essayer de se conformer au service WCF, plutôt que d’essayer d’implémenter quelque chose de personnalisé dans WCF, ce qui n’est jamais facile. Au bas de la section Autres ressources ci-dessous, vous verrez un lien qui décrit l’inspection de message nécessaire pour tenter de se conformer à un service WCF.

Cela dit, les sockets .NET ne communiquent pas de manière native avec WCF.

Toute tentative de le faire nécessitera une programmation personnalisée du côté de la WCF.

Que vous utilisiez TcpClient ou des sockets raw dans .NET pour vous connecter et communiquer avec WCF n’a pas d’importance. Toute interopérabilité doit être gérée avec une logique personnalisée dans WCF. Notez que Net.Tcp est un protocole de transport personnalisé. Il n’est pas techniquement utiliser TCP de la même manière que le TcpClient.

Par exemple, UDP est très couramment utilisé par les serveurs socket du monde Linux. WCF ne fournit pas de transport UDP intégré. Cependant, il existe un exemple UDP pour WCF qui implémente UDP pour WCF. Malheureusement, cet exemple n’illustre pas la communication vers et depuis un serveur de sockets UPD non WCF.

J’ai une question en suspens qui est assez détaillée, où j’explique mes efforts pour obtenir des exemples de code à tester de manière générique en utilisant UDP …

Est-il possible de faire fonctionner WcfTestClient pour des canaux de transport personnalisés?

Personne n’a encore répondu à ma question. Donc, si vous réussissez à faire ce travail, je suis très intéressé. Mon cas était motivé par le désir que le service WCF puisse appeler un serveur socket UDP fonctionnant sous Linux sans avoir à encombrer mon service avec un codage non-WCF. Je ne veux pas mélanger les approches.

Autres ressources…

La liaison Net.TCP utilise un format de cadrage de niveau fil personnalisé qui n’est pas vraiment documenté, bien que Nicholas Allen ait récemment lancé une série d’articles sur le sujet. La série commence ici: http://blogs.msdn.com/drnick/archive/2009/01/19/message-framing-part-1.aspx

Pour être honnête, Net.TCP est vraiment, actuellement, plus utile pour la communication WCF-WCF. Si vous voulez interagir avec un format TCP personnalisé que vous devez gérer, il est préférable d’utiliser des sockets raw ou de créer votre propre canal de transport WCF personnalisé (ce qui peut ne pas être sortingvial, btw)

Hy,

avez-vous activé le traçage WCF? Parce que si vous le faites et que vous obtenez le message suivant: “Le service ne vous permet pas de vous connecter anonymement.” alors c’est (généralement) un problème de sécurité.

Dans ce cas, désactivez le mode de sécurité pour votre liaison:

     

Mais mieux serait de travailler avec des certificates.