8
votes

WCF plusieurs liaisons

Je reçois l'erreur suivante lorsque j'essaye plusieurs points de fin. XXX Pré>

Voici mon app.config Sommaire P>

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="tcpBinding" transferMode="Buffered" portSharingEnabled="true">
          <reliableSession enabled="true" />
          <security mode="None">
            <transport clientCredentialType="None" protectionLevel="None" />
            <message clientCredentialType="None" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="WcfServiceLibrary1.Service1Behavior"
        name="WcfServiceLibrary1.Service1">
        <endpoint address="" binding="wsHttpBinding" contract="WcfServiceLibrary1.IService1">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <endpoint address="Service" binding="netTcpBinding" bindingConfiguration="tcpBinding"
          name="testTcp" contract="WcfServiceLibrary1.IService1" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8731/Design_Time_Addresses/WcfServiceLibrary1/Service1/" />
            <add baseAddress="net.tcp://localhost:8731/Design_Time_Addresses/WcfServiceLibrary1/Service" />

          </baseAddresses>

        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WcfServiceLibrary1.Service1Behavior">
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>


1 commentaires

Êtes-vous auto-hébergement ou hébergeez-vous dans IIS? IIS6 ou IIS7?


4 Réponses :


1
votes

Cela pourrait être que vous utilisez le même port pour les liaisons HTTP et TCP. Essayez de changer le port sur la liaison TCP à 8732 ou autre chose que 8731.


1 commentaires

Ce n'est pas le problème - ne devrait pas être, au moins. Mais juste pour le plaisir, essayez-le quand même! :-)



0
votes

Cela peut être un problème avec la liaison / la configuration TCP plutôt qu'un problème avec plusieurs liaisons.

Pour le tester, supprimez la référence à la liaison HTTP et voyez si la liaison TCP fonctionnera seule.


0 commentaires

13
votes

Vous ne pouvez pas partager le même port exact entre deux liaisons différentes, qui basées sur la configuration que vous avez affichée ci-dessus, vous faites actuellement. Vous devez avoir votre liaison WSHTTTP sur un port différent de la liaison Net.TCP. Le partage des ports Net.TCP est d'autoriser plusieurs processus utilisant le même port pour plusieurs net.tcp Net.TCP NE PAS partager un seul port sur plusieurs liaisons et protocoles différentes.

Pour utiliser avec succès le partage de ports WCF Net.TCP, vous devez démarrer le service de partage de ports NET.TCP '(Notez qu'il indique explicitement Net.TCP dans le nom). Vous voudrez probablement également la définir au démarrage automatique. Vous n'avez donc pas à continuer de le démarrer si vous redémarrez. Une fois le service de partage de port de Windows démarré, vous pouvez partager un seul port pour n'importe quelle liaison NET.TCP, dans le même processus, sur plusieurs processus, sur la même machine physique. Chaque liaison Net.TCP qui doit partager un port devra avoir la propriété PortSharingEnabled Set to TRUE. Si vous faites ce qui précède, vous devriez pouvoir réutiliser le même port pour tout point final Net.TCP comportant le partage de port activé, dans n'importe quel processus.

Cela ne vous permettra pas de partager ce même port avec l'une des liaisons WSHTTTTTTTTTTTTTTP, la liaison BASCHTTP, toute liaison MSMQ, ni une contraction tierce. Ceci est une caractéristique spécifique à la netcpbinding fourni avec WCF.

Pour référence: http://msdn.microsoft.com/en-us/library/ms734772.aspx


4 commentaires

Salut ... ça a du sens ... Je pensais pouvoir partager le même port à travers plusieurs liaisons avec le partage de port TCP. J'ai changé le port et ça a fonctionné. Merci!!


Mais alors ... pas http aussi une sorte de TCP? Existe-t-il des possibilités de faire fonctionner sur le même port?


HTTP est un protocole d'application qui fonctionne via le transport TCP / IP. Le TCP.net de WCF est également un protocole d'application, bien que propriétaire, qui fonctionne sur le transport TCP / IP. Utilisez tous les deux la couche de transport réseau TCP, mais elles n'ont aucune relation entre elles.


@Josh en regardant les protocoles, http.sys pourrait en théorie multiplex Net.TCP et HTTP sur le même port, car les demandes HTTP commencent toujours par un caractère alphabétique, comme le g dans / Http / 1.1 , alors que Net.TCP commence par un zéro binaire comme premier octet. Mais http.sys ne le fait pas pour nous.



1
votes

Je vous suggère d'activer Traçage afin d'obtenir une meilleure compréhension du problème. WCF pourrait être un b * tch quand il s'agit de montrer des messages d'erreur.


0 commentaires