La configuration WCF service TCP dans une application web
J'ai été aux prises avec cette pendant des jours, littéralement à travers une centaine d'articles donnant partielle des lignes directrices sur la façon de configurer un WCF basé sur TCP service dans une application web. Si quelqu'un peut m'aider, je vais faire de cette question dans un complète directive.
État actuel
Le net.connexion tcp fonctionne sur ma machine de développement. Il travaille également en local après avoir été déployé sur un Serveur Windows 2008 R2. Toutefois, il ne fonctionne pas à distance, même s'il est possible de telnet sur le port 808 sur le serveur à distance. Faites défiler vers le bas de la question pour plus de détails. S'il vous plaît aider si vous le pouvez.
Je vais créer une nouvelle question pour ce détail et de la mise à jour de cette question avec la réponse si j'obtiens un résultat hors de lui.
Code
J'ai créé ServerHubService.svc
avec le contenu suivant:
namespace Manage.SignalR
{
[ServiceContract]
public class ServerHubService
{
[OperationContract]
public void UpdateServerStatus(string serverStatus)
{
//Do something
}
}
}
De Configuration de l'application hébergeant le service
À la suite d'un tutoriel en ligne, j'ai ajouté ce qui suit à mon Web.config (j'ai essayé PLUSIEURS différentes variations). C'est le Web.config de l'application web qui héberge le service que j'ai plus tard souhaitez vous connecter avec TCP.
<configuration>
<system.serviceModel>
<services>
<service behaviorConfiguration="ServerHubBehavior"
name="Manage.SignalR.ServerHubService">
<endpoint address=""
binding="netTcpBinding"
bindingConfiguration="portSharingBinding"
name="MyServiceEndpoint"
contract="Manage.SignalR.ServerHubService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex"
binding="mexTcpBinding"
bindingConfiguration=""
name="MyServiceMexTcpBidingEndpoint"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://test.mydomain.com:808/SignalR/ServerHubService.svc" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServerHubBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netTcpBinding>
<binding name="portSharingBinding" portSharingEnabled="true"/>
</netTcpBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
minFreeMemoryPercentageToActivateService="0" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
</configuration>
httpGetEnabled="true"
est important parce que sinon vous ne pouvez pas créer un service de référence pour le service.
De Configuration du serveur sur lequel l'application web est en cours d'exécution
Je suis cette mise en place sur ma machine de développement qui a IIS 7.5
J'ai lu que IIS Express (intégré dans Visual Studio) ne prend pas en charge net.tcp, j'ai donc mis en place un nouveau site web dans IIS 7.5 utilisation .NET 4.5 et qui a un net.tcp liaison
Je suis aussi allé à des Paramètres Avancés pour le site web et de définir des Protocoles Activés à http,net.tcp
J'ai veillé à ce que la Fonctionnalité de Windows Non-Activation HTTP est activé (et redémarré). C'est une Fonctionnalité de Windows donc chercher des "fonctionnalités Windows Activer ou désactiver" trouver cet.
Confirmant l'application web est en cours d'exécution
Le site fonctionne très bien pour le reste de l'application web. J'ai configuré test.mydomain.com pour pointer vers l'adresse 127.0.0.1 dans mon hosts
fichier. Je peux même visiter http://test.mydomain.com/SignalR/ServerHubService.svc et il va me montrer une belle auto généré page de .NET, qui explique comment utiliser ce service.
So far So good.
La page générée par l' .NET me dit d'utiliser cette adresse pour générer une connexion à mon service:
net.tcp://computername/SignalR/ServerHubService.svc/mex
En essayant de se connecter au service en tant que client
Si vous ne vous souvenez pas de définir httpGetEnabled="true"
vous obtenez une erreur lorsque vous essayez de créer un service de référence. Si vous utilisez le Client Test WCF (également un outil inclus dans Visual Studio) et n'ai pas httpGetEnabled, vous obtiendrez un message d'erreur semblable au suivant:
Erreur: Impossible d'obtenir les Métadonnées à partir de
net.tcp://nom de l'ordinateur/SignalR/ServerHubService.svc/mexSi c'est un Windows (R) de la Communication de la Fondation de service à laquelle vous
avoir accès, veuillez vérifier que vous avez activé la publication des métadonnées à
l'adresse spécifiée. Pour obtenir de l'activation d'édition de métadonnées, veuillez
reportez-vous à la documentation MSDN à l'
http://go.microsoft.com/fwlink/?LinkId=65455.WS-MetadataÉchange d'Erreur URI:
net.tcp://nom de l'ordinateur/SignalR/ServerHubService.svc/mex Métadonnées
contient une référence qui ne peut pas être résolu:
net.tcp://nom de l'ordinateur/SignalR/ServerHubService.svc/mex'. Ne pouvait pas
se connecter au net.tcp://nom de l'ordinateur/SignalR/ServerHubService.svc/mex.
La tentative de connexion a duré un laps de temps de 00:00:04.0032289.TCP code d'erreur 10061: Aucune connexion n'a pu être faite car la cible
la machine activement refusée [2001:0:4137:9e76:c81:a4c:a547:b2fd]:808.
Aucune connexion n'a pu être établie car l'ordinateur cible activement
refusé [2001:0:4137:9e76:c81:a4c:a547:b2fd]:808
Toutefois, si vous avez tout fait comme ci-dessus, vous devriez être en mesure d'ajouter une référence vers le service.
De l'appel de méthodes dans le service
Lorsque vous essayez d'appeler un simple Hello World méthode au service du Client Test WCF, il renvoie l'erreur suivante:
Ne pouvait pas se connecter à
net.tcp://nom de l'ordinateur/SignalR/ServerHubService.svc. La connexion
la tentative a duré pendant un laps de temps de 00:00:04.0002288. TCP code d'erreur
10061: Aucune connexion n'a pu être établie car l'ordinateur cible activement
l'a refusé.
C'est intérieure stacktrace qui est inclus dans le message d'erreur:
Aucune connexion n'a pu être établie car l'ordinateur cible activement
refusé [2001:0:5ef5:79fb:3884:a:a547:b2fd]:808 à
Système.Net.Les Sockets.Socket.DoConnect(point de Terminaison endPointSnapshot,
SocketAddress socketAddress) à
Système.Net.Les Sockets.Socket.Connect(point de Terminaison remoteEP) à
Système.ServiceModel.Les canaux.SocketConnectionInitiator.Connect(Uri
uri, plage de Temps (timeout)
Si vous utilisez netstat -an |find /i "listening"
de voir que rien n'est à l'écoute sur le port 808, c'est probablement parce que le Net.Tcp port d'écoute de service de Carte n'est pas en cours d'exécution.
Confirmation
L'appel est acheminé à travers maintenant, mais une confirmation est nécessaire avant de pouvoir être considérée comme un succès. J'ai besoin de confirmer qu'il s'agit en fait net.tcp appel sur le port 808 et pas fait un appel sur le point de terminaison http. Je suis en train de le faire avec Wireshark, mais il ne se présente pas, sans doute parce que c'est un appel qui se passe à partir de et vers ma machine locale.
Déploiement
Le dernier défi de conquérir serait pour la déployer sur un serveur web, s'assurer que ce qui fonctionne sur la machine de développement, travaille également sur le serveur web.
Il ne fonctionne pas après la publication d'un Serveur Windows 2008 R2. Il donne à la commune SocketException: An existing connection was forcibly closed by the remote host
.
Il fonctionne bien en local sur le serveur, mais il ne fonctionne pas à distance.
Voici la liste de contrôle utilisée pour vérifier le serveur:
- Est le
Net.Tcp Listener Adapter
service en cours d'exécution? Oui - Est le site IIS liaison à
net.tcp
ensemble de808:*
? Oui - Est Activé Protocoles sous Paramètres Avancés pour le site dans IIS ensemble de
http,net.tcp
? Oui - Est le serveur écoute sur le port 808? Oui, vérifié avec
netstat -an |find /i "listening"
- Est un port 808 ouvert dans le pare-feu? Oui.
- Pare-feu est désactivé sur le serveur.
- Je peux telnet au serveur sur le port 808 de l'extérieur avec
telnet mydomain.com 808
- Dans la configuration du service sur le serveur, ce qui suit a été confirmé:
- baseAddress est ajusté à
net.tcp://mydomain.com:808/SignalR/ServerHubService.svc
- C'était
localhost
avant, mais il a changé demydomain.com
après il ne fonctionne pas sur le serveur:<identity><dns value="mydomain.com" /></identity>
- baseAddress est ajusté à
- Il a été testé avec un client en local sur le serveur et sur un autre serveur. À la fois peut se connecter au port 808 avec telnet et les deux donnent le même message d'erreur.
Quelle configuration est peut-être manquant sur le serveur? Je suis si près du but. Merci de m'aider dans la résolution de ce et complet de la question.
Voici la configuration du client sur le serveur en appelant le service:
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="MyServiceEndpoint" />
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://mydomain.com:808/SignalR/ServerHubService.svc"
binding="netTcpBinding" bindingConfiguration="MyServiceEndpoint"
contract="ServerHubService.ServerHubService" name="MyServiceEndpoint">
<identity>
<dns value="mydomain.com" />
</identity>
</endpoint>
</client>
</system.serviceModel>
J'ai aussi essayé sans 808 configuré dans le point de terminaison, ce qui est répandu pour être le port par défaut pour le net.les connexions tcp. Cependant, il 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 cela? Puis-je installer un programme sur un serveur qui va me dire exactement POURQUOI cet appel est bloqué?
Avec Wireshark configuré comme ceci, il est possible de regarder l'appel à venir au serveur sur le port 808 et, éventuellement, de déterminer la raison de l'appel ne fonctionne pas. Cependant, je n'ai aucune idée de comment analyser ce à l'heure actuelle.
Bonne chance
J'ai abandonné et mis en œuvre dans la couche de socket à la place. Cela a fonctionné immédiatement. J'espère que cela peut aider quelqu'un d'autre. Je suis une réponse parce que de nombreux problèmes ont été résolus et il ne fonctionne localement, éventuellement, de sorte que tout problème est probablement lié à m'environnement spécifique.
- Avez-vous activé la WCF non-activation HTTP composants? (plus de détails ici msdn.microsoft.com/en-us/library/ms731053.aspx). Aussi avez-vous ajouté tcp protocoles autorisés pour votre site web? (Gale Site Web -> Paramètres avancés -> Protocole Activé). Avez-vous essayé la génération de proxy basé sur les métadonnées exposées sur HTTP? (test.mydomain.com/SignalR/ServerHubService.svc)
- J'avais oublié de permis Non HTTP Activaition (je l'avais fait sur mon serveur de test uniquement). Malheureusement je reçois le même message d'erreur après l'activation de cette. J'avais déjà rappelé net.tcp sous paramètres Avancés, mais ont maintenant ajouté à la question de détails. Je reçois un intéressant erreur si j'essaie de générer le proxy basé sur http - je vais mettre à jour la question de la ce.
Vous devez vous connecter pour publier un commentaire.
Vous devez générer le Proxy sur la base des métadonnées exposées sur HTTP sur tcp.(assurez-vous que httpGetEnabled est définie à true). L'adresse que vous utilisez à la clientèle doit être hébergés adresse. Veuillez consulter ci-dessous post.
http://blogs.msdn.com/b/swiss_dpe_team/archive/2008/02/08/iis-7-support-for-non-http-protocols.aspx
netstat -an |find /i "listening"
et a constaté que rien n'est à l'écoute sur le port 808mydomain.com
:808/SignalR/ServerHubService.svc) et non pas lalocalhost
un.Le numéro de port peut ou peut ne pas être inclus depuis 808 est le port par défaut pour net.tcp.telnet mydomain.com 808
Dans votre question, vous avez mentionné que vous avez connecté "test.mydomain.com" mais l'erreur a changé le serveur à "computername". Ensuite, dans votre commentaire vous avez mentionné qu'il toujours pas à se connecter. Si vous souhaitez avoir l'alias retourné dans le WSDL/MEX Ajouter le useRequestHeadersForMetadataAddress nœud dans votre comportement en service. Voici les informations de MSDN sur ce nœud: MSDN useRequestHeadersForMetadataAddress nœud
C'est quoi votre config devrait ressembler. Il prend en compte la réponse donnée par Prasath (httpGetEnabled="true").
computername
Un hébergement Basé sur TCP service IIS a toujours été un ours. WCF, il est très facile de lancer votre propre service d'accueil, d'écoute sur votre port TCP. Ma recommandation serait de le faire et de le configurer pour exécuter 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 que vous avez besoin pour l'installation de la SPN (Service Principal Name) pour votre service WCF (sur la machine) et l'ai ajouté sur le compte de service en vertu de laquelle le service est en cours d'exécution.
Si vous l'exécutez en vertu de l'application par défaut utilisateur de la piscine, alors vous devez avoir le nom principal de service configuré pour la machine.
Je sais que c'est troublant, et est généralement la surprise d'attente bof nous les développeurs une fois que notre service est prêt à être déployé en production ou de pré-production environnements.
Le nom principal de service est utilisé par Kerberos pendant le processus d'authentification.
Essayez d'utiliser l'adresse IP de la machine pour résoudre votre service plutôt que le nom d'hôte. (Ce n'est pas supposé besoin d'un SPN), remplacer "test.mydomain.com" par l'adresse IP de l'appareil:
Prendre un coup d'oeil à ces articles:
- Kerberos pour l'Administrateur Occupé
- WCF sur l'intranet de l'authentification windows
- Le post suivant, essayez de lire celui qui n'est pas accepté comme réponse: Ce SPN dois-je mettre pour un net.service tcp?
Avez-vous essayé de service d'accueil (pour les tests) dans un service Windows sur votre machine locale? De cette façon, vous aurez au moins savoir si le problème est du côté service ou IIS/configuration du serveur.
Vous avez Net.Le Port TCP service de partage de course sur le serveur, je suppose... n'ont pas trouvé explicitement mentionnés.
J'ai eu un problème similaire ici aujourd'hui, tout en appelant un net.tcp service wcf de l'intérieur d'une asp.net l'api web. Je ne vais pas dire que de toutes les autres machines de ce service a travaillé pendant des années, mais les appels ont été effectués wcf auto hébergement, wcf iis asp.net la compatibilité de l'hébergement -> contre les nets.tcp service auto-hébergé. Lorsque j'ai publié mon simple api web appelant le même filet.service tcp, tout est allé de mal, et que toutes les connexions ont été abandonnées sans aucune raison, même l'ensemble de la wcf retraçant les deux parties (le client et les services) n'a pas aidé, juste parler de la même "connexion interrompue".
J'ai déjà su que net.tcp est livré avec la sécurité des transports activé à l'aide de l'authentification windows pour signer et la crypte de la communication, si bien, j'ai juste essayé de désactiver la sécurité et de tout commencer à fonctionner correctement.
Juste essayer de désactiver la sécurité de cette façon, les deux parties (le client et le service):
complète de la liaison de service:
J'espère que cela peut vous aider aussi.