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

La configuration WCF service TCP dans une application web

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.

La configuration WCF service TCP dans une application web

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/mex

Si 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 de 808:*? 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é de mydomain.com après il ne fonctionne pas sur le serveur: <identity><dns value="mydomain.com" /></identity>
  • 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.

La configuration WCF service TCP dans une application web

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.