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)?
Répondre
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 ...
Le choix d'un transport
Cet article dispose que "Le transport WCF TCP est optimisé pour le scénario où les deux extrémités de la communication utilisent WCF".Essayer de connecter un client non-WCF à un service WCF qui utilise le BasicHttpBinding.
Le développeur finit par écrire le code personnalisé via WebClient (par opposition à TcpClient).
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/c2d72c2d-c095-4ae1-b8ae-d15f32a4e0be/WCF vs Sockets .NET premières
La réponse rappelle que TCP + sérialisation binaire ou UDP + binaire sérialisation peut être nécessaire. Il est un échantillon de liaison UDP, comme I mentionné ci-dessus.
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/c0520111-c1ca-4ffd-a4e0-ac68e86130ee/Les demandes d'écriture personnalisés à simple WCF services
L'auteur explique comment déterminer le format du message qui doit être envoyé au service, si que le TcpClient ou autre client non-WCF sockets peut envoyer les informations d'écriture au service WCF. L'implication ici est que vous n'êtes pas en essayant de se conformer au service WCF , mais plutôt vous forcez le client de socket à faire le lourd de levage. Même ainsi, vous n'obtenez pas les avantages intégrés des liaisons WCF si vous attendez cela.
http://blogs.msdn.com/carlosfigueira/archive/2008/01/13/writing-custom-requests-to-simple-wcf-services.aspx
Ma réponse ne mérite certainement pas d'être downvoted. –
mais vous avez critiqué la merveilleuse WCF, alors donc vous devez être pris à l'extérieur et tiré :) - avoir +1 de moi cependant. – gbjbaanb
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. –
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.
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)
Il est bien documenté, voir [MC-NMF] .NET Spécifications de protocole de trame de message. – Soonts
- 1. Comment écrire un transport personnalisé basé sur socket pour WCF
- 2. Performance de WCF avec net.tcp
- 3. setSoTimeout sur un socket client n'affecte pas le socket
- 4. WCF - Connexion socket non fermée à l'aide de WS-Compression avec la liaison net.tcp
- 5. create net.tcp liaison wcf objet de service dans silverlight
- 6. Quel SPN dois-je définir pour un service net.tcp?
- 7. Écrire un serveur basé sur socket en Python, stratégies recommandées?
- 8. Comment utiliser svcutil.exe pour créer un proxy client ib WCF?
- 9. Le client WPF communique avec le service Windows WCF sur réseau, réalisable?
- 10. Service WCF RESTful sur Service WCF standard
- 11. Comment construire un client OpenFire basé sur JavaScript et Flash
- 12. Service WCF unique pour plusieurs connexions client
- 13. Bon service de paiement basé sur l'utilisation
- 14. Comment implémenter un client jabber basé sur Flash?
- 15. Partage de constantes sur un service WCF
- 16. Erreur du client de test WCF: Impossible d'appeler le service
- 17. Serveur de socket Java tcp avec socket client j2me
- 18. Comment mettre à jour mon service wcf lorsque j'utilise le client de test WCF?
- 19. Construction d'un client de messagerie Pop3 (basé sur le Web)
- 20. Comment Auto Découvrir un service WCF?
- 21. WCF Service Client avec svcutil (aucun client "extra" clientide-datatype def.)
- 22. Comment utiliser une classe commune entre le client Winforms et le service Web?
- 23. Liaison MSF de WCF avec un service IIS - comment instancier le service?
- 24. Erreur sur le programme client/serveur c: "Connect: opération de socket sur non-socket"
- 25. Performances WCF net.tcp par rapport à namedpipes
- 26. communication basée sur socket serveur client
- 27. Comment se connecter à un service WCF avec IronPython
- 28. Vérifier le service WCF sans créer de proxy client
- 29. Client Amazon S3 basé sur SOAP
- 30. Comment appeler un service BizTalk net.TCP depuis une requête TCP brute?
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? –
EnocNRoll, vous avez absolument raison. J'essaie d'utiliser un client basé sur socket pour communiquer un service WCF basé sur net.tcp. – Burhan