2009-06-26 2 views
0

J'ai un service WCF et je l'héberge dans un service Windows.BasicHttpBinding est-il réellement requis lors de l'exposition d'un service WCF en tant que service Web pour Client cible .NET 2.0?

J'ai essayé d'ajouter une référence pour le service à partir d'un client Windows Form basé sur .NET 2.0. Je pourrais obtenir la référence Web en pointant vers le httpGetUrl = "http: // localhost: 8002/HBAccess/help/mex" mais quand je vérifie le Reference.cs --- Il contient seulement un espace de noms avec rien dedans.

Maintenant, j'ajouter le basicHttpBinding et répéter les mêmes étapes:

Et maintenant, je peux voir les classes pour le service Web.

Mon collègue aîné insiste sur le fait que définir httpGetEnabled sur true serait suffisant pour exporter le service WCF via http et faire une référence Web appropriée. Est-ce que quelqu'un pourrait m'indiquer à ce que je manque ici??

<system.serviceModel> 
<services> 
    <service behaviorConfiguration="HBAcsNX.HBAccessBehavior" name="HBAcsNX.HBAccess"> 
     <!--<endpoint address="" binding="basicHttpBinding" contract="HBAcsNX.HBAccess" />--> 
     <endpoint address="HBAccess" binding="netTcpBinding" contract="HBAcsNX.HBAccess" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
       <add baseAddress="net.tcp://localhost:18264/HBAccess/" /> 
       <add baseAddress="http://localhost:8002/HBAccess/" /> 
      </baseAddresses> 
     </host> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
     <behavior name="HBAcsNX.HBAccessBehavior"> 
      <serviceDebug includeExceptionDetailInFaults="True" httpHelpPageUrl="http://localhost:8002/HBAccess/help" /> 
      <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8002/HBAccess/help/mex" /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 
</system.serviceModel> 

// résultant Reference.cs (vide de stub proxy avec seulement namespace)

#pragma warning disable 1591 
namespace Form.ServiceClient { 
} 
#pragma warning restore 1591 

Répondre

2

le problème est mexHttpBinding n'est pas exposer réellement votre service, son exposition seulement defenition de votre service, et depuis .net 2.0 ne comprend pas NetTcp vous obtenez un espace de noms vide, vous avez besoin basicHttpBinding car c'est votre point de terminaison de service.

si vous regardez les contrats que vous voyez que le contrat de mexHttpBinding est même pas "HBAcsNX.HBAccess" mais "IMetadataExchange".

2

Vous devez spécifier une liaison, et basicHttpBinding est le seul qui interagit avec un client .NET 2.0. Les clients ASMX .NET 2.0 prennent uniquement en charge XML sur HTTP et sans protocoles WS- *.

1

Votre config ne ligne pas tout à fait .....

<service name="HBAcsNX.HBAccess" 
     behaviorConfiguration="HBAcsNX.HBAccessBehavior" > 
    <host> 
     <baseAddresses> 
      <add baseAddress="http://localhost:8002/HBAccess/" /> 
     </baseAddresses> 
    </host> 

    <endpoint address="mex" 
      binding="mexHttpBinding" contract="IMetadataExchange" /> 
</service> 

Si vous prenez tout cela en compte, vous obtenez http://localhost:8002/HBAccess/ à l'adresse de base, plus mex du point de terminaison MEX ->http://localhost:8002/HBAccess/mex

Mais dans la configuration de votre comportement, vous utilisez une adresse différente pour MEX:

<behavior name="HBAcsNX.HBAccessBehavior"> 
    <serviceMetadata httpGetEnabled="true" 
        httpGetUrl="http://localhost:8002/HBAccess/help/mex" /> 
</behavior> 

ici, vous pointez http://localhost:8002/HBAccess/help/mex - Notez le supplément /help là. Maintenant, lequel est-ce vraiment?

Je recommande jeter loin la httpGetUrl explicite dans la configuration du comportement de service - il suffit d'utiliser:

<behavior name="HBAcsNX.HBAccessBehavior"> 
    <serviceMetadata httpGetEnabled="true" /> 
</behavior> 

et vous devriez être en mesure d'obtenir votre MEX à http://localhost:8002/HBAccess/mex.

Marc

+0

Je viens d'essayer ce que vous suggérez et ne pouvait toujours pas être trouvé le service Web dans le http: // localhost : 8002/HBAccess/mex URI – Nap