2009-02-13 5 views
38

J'ai développé un service WCF qui utilise l'adaptateur net.tcp et écoute un port spécifique. Je veux me connecter à ce service en utilisant 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 capable de me connecter au service par un autre client qui utilise les adresses/Contrats/Contrats du service WCF.
Existe-t-il un moyen qui me permette de communiquer avec un service WCF en utilisant un client basé sur une socket ordinaire?Comment utiliser un client basé sur socket avec le service WCF (net.tcp)?

+0

Pour être sûr que Tout le monde comprend ce que vous essayez de faire ici ... Pourriez-vous clarifier si vous essayez d'utiliser la fonction de programmation de sockets intégrée au sein de .NET pour vous connecter à un service WCF Net.Tcp et vice versa? –

+0

EnocNRoll, vous avez absolument raison. J'essaie d'utiliser un client basé sur socket pour communiquer un service WCF basé sur net.tcp. – Burhan

Répondre

48

La décision clé est de rendre ou non le service WCF conforme au client socket ou de rendre le client socket conforme au service WCF.

Il sera plus simple de tenter 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 décrivant l'inspection des messages nécessaire pour tenter de se conformer à un service WCF. Cela dit, les sockets .NET ne communiquent pas nativement avec WCF.

Toute tentative en ce sens nécessitera une programmation personnalisée du côté WCF. Que vous utilisiez TcpClient ou des sockets brutes dans .NET pour vous connecter à et communiquer avec WCF, cela n'a pas d'importance.

Une telle 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'utilise techniquement pas TCP de la même manière que le TcpClient. Par exemple, UDP est très couramment utilisé par les serveurs de socket dans le 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 socket non-WCF UPD.

J'ai une question en suspens qui est assez détaillée où j'explique mon effort pour obtenir le code d'échantillon à génériquement testable pour utiliser UDP ...

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

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 du service WCF de pouvoir appeler un serveur de socket UDP fonctionnant sous Linux sans avoir à encombrer mon service de codage non-WCF. Je ne veux pas mélanger les approches.

Autres ressources ...

+10

Ma réponse ne mérite certainement pas d'être downvoted. –

+2

mais vous avez critiqué la merveilleuse WCF, alors donc vous devez être pris à l'extérieur et tiré :) - avoir +1 de moi cependant. – gbjbaanb

+1

Merci, j'essaie de rendre ma réponse utile et je les mets toujours à jour s'ils sont incorrects de quelque façon que ce soit. Je les considère comme des références pour mes connaissances personnelles, pas seulement pour les points sur StackOverflow. –

0

Hy,

Avez-vous activé la WCF Tracing? Parce que si vous le faites et 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 réglage de sécurité.

Dans ce cas, désactiver le mode de sécurité pour votre reliure:

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

Mais mieux serait de travailler avec des certificats.

6

Le Net.TCP liaison utilise un format de cadrage au niveau du fil personnalisé qui est pas vraiment documenté, bien que Nicholas Allen a commencé une série de messages de blog sur le sujet récemment. 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 vers WCF. Si vous voulez interopérer avec un format TCP personnalisé que vous devez gérer, il vaut mieux utiliser des sockets raw ou créer votre propre canal de transport WCF personnalisé (ce qui peut ne pas être trivial, btw)

+1

Il est bien documenté, voir [MC-NMF] .NET Spécifications de protocole de trame de message. – Soonts

Questions connexes