2010-11-12 5 views
11

J'ai un service WCF hébergé en tant que service Windows. Nous aimerions activer un point de terminaison mex à la même adresse (mais avec un suffixe '/ mex'). J'ai essayé de le faire (sans succès) en utilisant la configuration suivante:Comment forcer un point de terminaison net.tcp mex (mexTcpBinding) à participer au partage de port?

<system.serviceModel> 

    <services> 
    <service 
     name="MyCompany.MyService" 
     behaviorConfiguration="defaultServiceBehavior"> 

     <host> 
     <baseAddresses> 
      <add baseAddress="net.tcp://localhost"/> 
     </baseAddresses> 
     </host> 

     <endpoint 
     address="MyService" 
     binding="netTcpBinding" 
     contract="MyCompany.IMyService" 
     bindingConfiguration="netTcpBindingConfig" 
     /> 

     <endpoint 
     address="MyService/mex" 
     binding="mexTcpBinding" 
     contract="IMetadataExchange" 
     /> 

    </service> 
    </services> 

    <behaviors> 
    <serviceBehaviors> 
     <behavior name="defaultServiceBehavior"> 
     <serviceMetadata /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 

    <bindings> 
    <netTcpBinding> 
     <binding name="netTcpBindingConfig" portSharingEnabled="true" /> 
    </netTcpBinding> 
    </bindings> 

</system.serviceModel> 

Quand il fonctionne, l'hôte de service lève une AddressAlreadyInUseException plaint que « Il y a déjà un écouteur sur IP endpoint 0.0.0.0:808 ». Cela a un sens pour moi parce que le service de partage de port a ouvert ce port afin de desservir le point de terminaison MyService avec tous les autres services demandant de partager ce port sur cette machine.

Il semble donc que le point de terminaison MEX veut avoir accès exlusive au port 808. Je peux contourner ce en modifiant légèrement le point de terminaison MEX comme ceci:

<endpoint 
    address="net.tcp://localhost:818/MyService/mex" 
    binding="mexTcpBinding" 
    contract="IMetadataExchange" 
    /> 

Cela signifie que le point de terminaison MEX a maintenant son propre port exclusif . L'inconvénient avec cela est que tout autre service qui veut exposer un point de terminaison mex aura également besoin d'un port unique pour son point de terminaison mex. Cela le rend très imprévisible lors de la recherche de points de terminaison mex.

Existe-t-il un moyen de forcer le point de terminaison mex à participer au partage de port?

+0

Juste une pensée: Ajouter bindingConfiguration = « netTcpBindingConfig » au point d'extrémité MEX? –

+0

@Torben Oui, j'ai essayé ça. Quand je fais cela, le point de terminaison mex n'a pas de problème de partage, mais il échoue complètement à produire des métadonnées. –

Répondre

8

Deux options:

  1. La manière simple: changer l'ensemble de liaison pour le point de netTcpBinding à MEX et l'ont réutiliser votre bindingConfiguration. Le paramètre mexTCPBinding est uniquement destiné à être pratique et facultatif. Si cela ne fonctionne pas pour vous, ne l'utilisez pas.

  2. La solution: vous pouvez modifier mexTCPBinding pour activer le partage. L'exemple que je l'ai vu dans le code est ici: http://blogs.msdn.com/b/drnick/archive/2006/08/23/713297.aspx

+0

Merci pour votre réponse. J'ai essayé de changer mexTcpBinding à netTcpBinding mais pas de dés. Quand je fais cela, le service démarre et ne se plaint pas de problèmes de partage (ce qui est cool) mais ne répond absolument pas aux demandes mex (ce qui n'est pas cool). Vraisemblablement, il y a quelque chose d'autre que j'ai besoin de configurer si j'utilise netTcpBinding que je ne connais pas? –

+0

@Damian avez-vous déjà résolu cela? Bizarrement, nous voyons ce problème sur ma machine locale, mais pas dans la production –

+1

La méthode facile a fonctionné pour moi (Option 1). –

Questions connexes