Comment utiliser socket based client avec WCF (net.tcp) service?
j'ai développé un service WCF qui utilise le net.adaptateur 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 je tente d'envoyer des données à ce service, j'obtiens l'erreur: "La connexion existante a dû être fermée par l'hôte distant".
Cependant, je suis en mesure de me connecter au service par un autre client qui utilise le Adresse / liens / contrats du service WCF.
Y a-t-il un moyen qui me permette de communiquer avec un service de la WCF en utilisant un client ordinaire basé sur socket?
3 réponses
la décision clé est de savoir si oui ou non le service WCF doit être conforme au client socket ou si le client socket doit être conforme au service WCF.
il sera plus simple de tenter de se conformer au service de la WCF, plutôt que d'essayer d'implémenter quelque chose de personnalisé au sein de la WCF, ce qui n'est jamais facile. Au bas de la section "Autres Ressources" ci-dessous, vous verrez un lien qui décrit le message d'inspection qui est nécessaire pour tenter de se conformer à un service de la WCF.
cela dit, les sockets.Net ne communiquent pas nativement avec la WCF.
toute tentative de le faire nécessitera une programmation personnalisée du côté de la FMC.
que vous utilisiez des sockets TcpClient ou raw dans .NET pour vous connecter et communiquer avec WCF n'a pas d'importance. Une telle interopérabilité doit être gérée avec une logique personnalisée au sein de la WCF. Notez que Net.Tcp est un protocole de transport personnalisé. Il n'est pas techniquement, TCP utilise TCP de la même manière que TcpClient.
par exemple, UDP est très couramment utilisé par les serveurs socket dans le monde Linux. WCF ne fournit pas de transport UDP intégré. Cependant, il y a un échantillon UDP pour WCF qui implémente UDP pour WCF. Malheureusement, cet exemple n'illustre pas la communication vers et depuis un serveur de socket UPD non-WCF.
j'ai une question en suspens qui est plutôt détaillé où je explique mes efforts à obtenir le code échantillon pour être testable de façon générique pour l'utilisation de UDP...
est-il possible de faire fonctionner le WcfTestClient pour des canaux de transport personnalisés?
personne n'a encore répondu à ma question. Donc, si vous réussissez à faire en sorte que cela fonctionne, je suis très intéressé. Mon cas était motivé par le désir pour le Service WCF d'être en mesure d'appeler à un serveur de socket UDP fonctionnant sur Linux sans avoir à encombrer mon service avec le codage non-WCF. Je ne veux pas mélanger les approches.
Autres Ressources...
-
choisir un Transport
cet article stipule que "le transport TCP de la WCF est optimisé pour le scénario où les deux extrémités de la de la communication sont en utilisant WCF". -
essayer de connecter un client non-WCF à un service WCF qui utilise la reliure BasicHttpBinding.
le développeur finit d'écrire du code personnalisé via le WebClient (par opposition à TcpClient).
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/c2d72c2d-c095-4ae1-b8ae-d15f32a4e0be/ -
WCF vs. Raw. Sockets
la réponse souligne que TCP + sérialisation binaire ou UDP + binaire une sérialisation pourrait être nécessaire. Y est un échantillon liant UDP, car I mentionnés ci-dessus.
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/c0520111-c1ca-4ffd-a4e0-ac68e86130ee/ -
Écrire des requêtes personnalisées à la WCF Simple Services
l'auteur explique comment comprendre le format du message que doit être envoyé pour le service, que le TcpClient ou un autre non-WCF le client sockets peut envoyer l'écriture informations au service WCF. Le conséquence de tout cela est que vous n'êtes pas tenter de se conformer à la FMC service, mais plutôt vous forcez le client socket pour faire le lourd levage. De même, vous pas le avantages de la WCF fixations si vous attendez que.
http://blogs.msdn.com/carlosfigueira/archive/2008/01/13/writing-custom-requests-to-simple-wcf-services.aspx
Sur Le Net.TCP binding utilise un format de cadrage personnalisé qui n'est pas vraiment documenté, bien que Nicholas Allen ait commencé une série de billets 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 à WCF. si vous voulez interoper avec un format TCP personnalisé que vous devez gérer, vous êtes il est préférable d'utiliser des sockets bruts ou de créer votre propre canal de transport personnalisé de la FMC (qui pourrait ne pas être trivial, btw)
Hy,
avez-vous activé le traçage WCF? Parce que si vous le faites et que vous recevez le message suivant: "le service ne vous permet pas de vous connecter anonymement." , puis il est (généralement) un paramètre de sécurité de problème.
dans ce cas désactiver le mode de sécurité pour votre liaison:
<netTcpBinding>
<binding name="MyCustomBinding">
<security mode="None" />
</binding>
</netTcpBinding>
mais il vaudrait mieux travailler avec des certificats.