Configuration du service WCF TCP dans une application Web

Cela fait des jours que je me bats avec cela, en passant en revue une centaine d’articles donnant des instructions partielles sur la configuration d’un service WCF TCP dans une application Web. Si quelqu’un peut m’aider, je ferai de cette question une ligne direcsortingce complète .

Statut actuel

La connexion net.tcp fonctionne sur ma machine de développement. Il fonctionne également localement après son déploiement sur Windows Server 2008 R2. Cependant, cela ne fonctionne pas à distance, même s’il est possible de mettre telnet sur le port 808 sur le serveur à distance. Faites défiler jusqu’au bas de la question pour plus de détails. S’il vous plait aidez si vous le pouvez.

Je vais créer une nouvelle question pour ce détail et mettre à jour cette question avec la réponse si j’en obtiens un résultat.

Code

J’ai créé ServerHubService.svc avec le contenu suivant:

 namespace Manage.SignalR { [ServiceContract] public class ServerHubService { [OperationContract] public void UpdateServerStatus(ssortingng serverStatus) { // Do something } } } 

Configuration de l’application hébergeant le service

Après un tutoriel en ligne, j’ai ajouté ce qui suit à mon Web.config (j’ai essayé BEAUCOUP de variantes). Il s’agit du fichier Web.config de l’application Web hébergeant le service auquel je souhaite par la suite me connecter avec TCP.

                                  

httpGetEnabled="true" est important car sinon, vous ne pouvez pas créer de référence de service pour le service.

Configuration du serveur sur lequel l’application Web est en cours d’exécution

Je suis en train de l’installer sur ma machine de développement qui a IIS 7.5

J’ai lu qu’IIS Express (intégré à Visual Studio) ne prend pas en charge net.tcp. J’ai donc configuré un nouveau site Web dans IIS 7.5 à l’aide de .NET 4.5 et disposant d’une liaison net.tcp.

des liaisons dans IIS

Je suis également allé dans les parameters avancés du site Web et ai défini les protocoles http,net.tcp sur http,net.tcp

Je me suis assuré que l’activation non-HTTP des fonctionnalités de Windows est activée (et redémarrée). C’est une fonctionnalité Windows, alors recherchez «Activer ou désactiver les fonctionnalités Windows» pour le trouver.

entrez la description de l'image ici

Confirmation de l’application Web en cours d’exécution

Le site Web fonctionne bien pour le rest de l’application Web. J’ai configuré test.mydomain.com pour qu’il pointe vers 127.0.0.1 dans mon fichier hosts . Je peux même visiter http://test.mydomain.com/SignalR/ServerHubService.svc et il me montrera une belle page générée automatiquement à partir de .NET, expliquant comment utiliser ce service.

Jusqu’ici tout va bien.

La page générée par .NET m’indique d’utiliser cette adresse pour générer une connexion à mon service:

 net.tcp://computername/SignalR/ServerHubService.svc/mex 

Essayer de se connecter au service en tant que client

Si vous ne vous souvenez pas de définir httpGetEnabled="true" vous obtiendrez une erreur en essayant de créer une référence de service. Si vous utilisez le client de test WCF (également un outil inclus dans Visual Studio) sans définir httpGetEnabled, vous obtiendrez une erreur comme celle-ci:

Erreur: Impossible d’obtenir les métadonnées à partir de net.tcp: //nom_ordinateur/SignalR/ServerHubService.svc/mex

S’il s’agit d’un service Windows (R) Communication Foundation auquel vous avez access, vérifiez que vous avez activé la publication des métadonnées à l’adresse spécifiée. Pour obtenir de l’aide sur la publication de métadonnées, consultez la documentation MSDN à l’adresse http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata.

URI d’erreur Exchange: net.tcp: //nom_ordinateur/SignalR/ServerHubService.svc/mex Les métadonnées contiennent une référence qui ne peut pas être résolue: ‘net.tcp: // nom_ordinateur_SignalR/ServerHubService.svc/mex’. Impossible de se connecter à net.tcp: //nom_ordinateur/SignalR/ServerHubService.svc/mex. La tentative de connexion a duré 00: 00: 04.0032289.

Code d’erreur TCP 10061: Aucune connexion n’a pu être établie car la machine cible l’a activement refusée [2001: 0: 4137: 9e76: c81: a4c: a547: b2fd]: 808. Aucune connexion n’a pu être établie car la machine cible l’a activement refusée [2001: 0: 4137: 9e76: c81: a4c: a547: b2fd]: 808

Toutefois, si vous avez suivi toutes les étapes ci-dessus, vous devriez pouvoir append une référence au service.

Méthodes d’appel dans le service

Lorsque vous essayez d’appeler une méthode Hello World simple dans le service à partir du client de test WCF, l’erreur suivante s’affiche:

Impossible de se connecter à net.tcp: //nom_ordinateur/SignalR/ServerHubService.svc. La tentative de connexion a duré 00: 00: 04.0002288. Code d’erreur TCP 10061: Aucune connexion n’a pu être établie car la machine cible l’a activement refusée.

C’est le stacktrace interne qui est inclus dans l’erreur:

Aucune connexion n’a pu être établie car la machine cible l’a activement refusée [2001: 0: 5ef5: 79fb: 3884: a: a547: b2fd]: 808 sur System.Net.Sockets.Socket.DoConnect (EndPoint endPointSnapshot, SocketAddress socketAddress) sur System .Net.Sockets.Socket.Connect (EndPoint remoteEP) à System.ServiceModel.Channels.SocketConnectionInitiator.Connect (Uri uri, délai d’attente TimeSpan)

Si vous utilisez netstat -an |find /i "listening" pour vous assurer que rien n’écoute sur le port 808, c’est probablement parce que le service Net.Tcp Listener Adapter n’est pas en cours d’exécution.

Confirmation

L’appel est passé, mais une confirmation est nécessaire avant de pouvoir déclarer un succès. Je dois confirmer qu’il s’agit en fait d’un appel net.tcp sur le port 808 et non en réalité d’un appel sur le sharepoint terminaison http. J’essaie de faire cela avec Wireshark, mais cela ne s’affiche pas, probablement parce que c’est un appel passé depuis et vers ma machine locale.

Déploiement

Le dernier défi à surmonter serait de le déployer sur un serveur Web, en veillant à ce que tout ce qui fonctionne sur la machine de développement fonctionne également sur le serveur Web.

Cela ne fonctionne pas après la publication sur Windows Server 2008 R2. Cela donne la SocketException: An existing connection was forcibly closed by the remote host commune SocketException: An existing connection was forcibly closed by the remote host .

Cela fonctionne bien localement sur le serveur, mais cela ne fonctionne pas à distance.

Voici la liste de contrôle utilisée pour vérifier le serveur:

  • Le service Net.Tcp Listener Adapter en cours d’exécution? Oui
  • Est-ce que le site IIS qui lie à net.tcp défini sur 808:* ? Oui
  • Les protocoles activés sous Paramètres avancés du site dans IIS sont-ils définis sur http,net.tcp ? Oui
  • Le serveur écoute-t-il sur le port 808? Oui, vérifié avec netstat -an |find /i "listening"
  • Un port 808 est-il ouvert dans le pare-feu? Oui.
    • Le pare-feu est désactivé sur le serveur.
    • Je peux établir une connexion telnet avec le serveur sur le port 808 depuis l’extérieur avec telnet mydomain.com 808
  • Lors de la configuration du service sur le serveur, les éléments suivants ont été confirmés:
    • baseAddress est ajusté à net.tcp://mydomain.com:808/SignalR/ServerHubService.svc
    • C’était localhost auparavant, mais il a été remplacé par mydomain.com que cela ne fonctionnait pas sur le serveur:
  • Il a été testé avec un client localement sur le serveur et sur un autre serveur. Les deux peuvent se connecter au port 808 avec telnet et tous deux donnent le même message d’erreur.

Quelle configuration pourrait être manquante sur le serveur? Je suis si proche du but. Aidez-moi à résoudre ce problème et complétez la question.

Voici la configuration du client sur le serveur qui appelle le service:

               

J’ai également essayé sans configuration 808 configurée dans le système d’extrémité, car ce serait le port par défaut pour les connexions net.tcp. Cependant, cela donne toujours le même résultat.

Au lieu d’essayer beaucoup de choses au hasard, la bonne question est peut-être: comment déboguer quelque chose comme ça? Puis-je installer un programme sur l’un ou l’autre serveur qui me dira exactement pourquoi cet appel est bloqué?

Avec Wireshark configuré de la sorte, il est possible de regarder l’appel qui arrive sur le serveur sur le port 808 et éventuellement de déterminer pourquoi l’appel ne fonctionne pas. Cependant, je ne sais pas comment parsingr cela à l’heure actuelle.

Wirehark

Bonne chance

J’ai abandonné et implémenté cela dans la couche de socket à la place. Cela a fonctionné immédiatement. J’espère que cela peut aider quelqu’un d’autre, cependant. Je prépare une réponse parce que beaucoup de problèmes ont été résolus et que cela a finalement fonctionné localement, donc tout problème restant est probablement lié à mon environnement spécifique.

Vous devez générer le proxy en fonction des métadonnées exposées sur HTTP pour TCP (assurez-vous que httpGetEnabled est défini sur true). L’adresse que vous utilisez sur le client doit être l’adresse hébergée. S’il vous plaît se référer à la poste ci-dessous.

http://blogs.msdn.com/b/swiss_dpe_team/archive/2008/02/08/iis-7-support-for-non-http-protocols.aspx

Dans votre question, vous avez indiqué que vous vous êtes connecté à “test.mydomain.com” mais que l’erreur a changé le serveur en “nom_ordinateur”. Ensuite, dans votre commentaire, vous avez mentionné qu’il ne parvenait toujours pas à se connecter. Si vous souhaitez que l’alias soit renvoyé dans le WSDL / MEX, ajoutez le nœud useRequestHeadersForMetadataAddress dans le comportement de votre service. Voici les informations MSDN sur ce nœud: nœud MSDN useRequestHeadersForMetadataAddress

Voici à quoi devrait ressembler votre configuration. Ceci prend en compte la réponse donnée par Prasath (httpGetEnabled = “true”).

            

L’hébergement d’un service basé sur TCP dans IIS a toujours été un ours. Avec WCF, il est très facile d’exécuter votre propre hôte de service en écoutant votre port TCP. Ma recommandation serait de le faire et de le configurer pour fonctionner en tant que service Windows.

Voir cet article: http://msdn.microsoft.com/en-us/library/ff649818.aspx

Je suppose que le problème que vous rencontrez est la nécessité de configurer le SPN (nom du principal de service) pour votre service WCF (sur la machine) et de l’append au compte de service sous lequel le service est exécuté.

Si vous l’exécutez sous l’utilisateur du pool d’applications par défaut, vous devez configurer le SPN pour la machine.

Je sais que cela est troublant et que la surprise nous attend généralement lorsque notre service est prêt à être déployé dans des environnements de production ou de pré-production.

Le SPN est utilisé par Kerberos lors du processus d’authentification.

Essayez d’utiliser l’adresse IP de la machine pour résoudre votre service au lieu du nom d’hôte. (Ceci n’est pas supposé nécessiter un SPN), remplacez “test.mydomain.com” par l’adresse IP de la machine:

      

Jetez un coup d’œil à ces articles: – Kerberos pour l’administrateur occupé
– WCF sur intranet avec authentification Windows
– Pour le post suivant, essayez de lire celui qui n’est pas accepté comme réponse: quel SPN dois-je définir pour un service net.tcp?

Avez-vous essayé d’héberger un service (à des fins de test) dans un service Windows sur votre ordinateur local? De cette façon, vous saurez au moins si le problème concerne le service ou sa configuration IIS / serveur.

Vous avez le service de partage de port Net.TCP en cours d’ exécution sur le serveur, je suppose … que vous ne l’avez pas trouvé explicitement.

J’ai eu un problème similaire ici aujourd’hui, alors que j’appelais un service wcf net.tcp depuis l’intérieur d’une API Web asp.net. Je ne dirai pas que sur toutes les autres machines, ce service fonctionne depuis des années, mais les appels ont été effectués. Hébergement indépendant avec wcf, hébergement compatible avec l’isp.net d’isf.net -> contre le service auto-hébergé net.tcp. Lorsque j’ai alors publié ma simple API Web appelant le même service net.tcp, tout a mal tourné et toutes les connexions ont été interrompues sans raison, même le traçage complet de wcf (service client et client) n’a pas aidé, il a simplement dit la même chose. “connexion interrompue”.

Je savais déjà que net.tcp était doté de la sécurité sur le transport activée, utilisant l’authentification Windows pour signer et chiffrer la communication. J’ai bien essayé de désactiver la sécurité et tout commence à fonctionner correctement.

Essayez de désactiver la sécurité de la manière suivante (client et service):

  

liaison de service complet:

      

J’espère que cela peut vous aider aussi.