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.
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.
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:
Net.Tcp Listener Adapter
en cours d’exécution? Oui net.tcp
défini sur 808:*
? Oui http,net.tcp
? Oui netstat -an |find /i "listening"
telnet mydomain.com 808
net.tcp://mydomain.com:808/SignalR/ServerHubService.svc
localhost
auparavant, mais il a été remplacé par mydomain.com
que cela ne fonctionnait pas sur le serveur:
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.
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.