2009-06-26 1 views
0

У меня есть служба WCF и я размещаю ее в службе Windows.Действительно ли basicHttpBinding требуется при экспорте службы WCF в качестве веб-службы для целевого клиента .NET 2.0?

Я попытался добавить ссылку для службы с клиента Windows Form, основанного на .NET 2.0. Я могу получить веб-ссылку, указав на httpGetUrl = "http: // localhost: 8002/HBAccess/help/mex", но когда я проверяю Reference.cs --- Он содержит только пространство имен, в котором ничего нет.

Теперь добавьте BasicHttpBinding и повторите те же действия:

И теперь я могу видеть классы для веб-службы.

Мой старший коллега настаивает на том, что установка httpGetEnabled в true будет достаточной для экспорта службы WCF через http и создания правильной ссылки в Интернете.

Может ли кто-нибудь указать мне на то, что мне не хватает здесь?

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

// Результирующий Reference.cs (Empty прокси заглушки только с пространством имен)

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

ответ

2

проблема mexHttpBinding это на самом деле не подвергая службы, его только обнажая Defenition вашего сервиса, и с тех пор .net 2.0 не понимает nettcp вы получаете пустое пространство имен, что вам нужно basicHttpBinding, потому что это ваша фактически конечная точка обслуживания.

если посмотреть на контракты, которые Вы видите, что контракт на mexHttpBinding даже не "HBAcsNX.HBAccess" а "IMetadataExchange".

2

Вы должны указать привязку, и BasicHttpBinding является единственным, который взаимодействует с клиентом в .NET 2.0. .NET 2.0 ASMX-клиенты поддерживают только XML через HTTP и без протоколов WS- *.

1

Ваш конфиг не совсем выстраиваться .....

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

Если принять все это во внимание, вы получаете http://localhost:8002/HBAccess/ от базового адреса, а также mex от MEX конечной точки ->http://localhost:8002/HBAccess/mex

Но в конфигурации поведения, вы используете другой адрес для MEX:

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

Здесь вы указываете на http://localhost:8002/HBAccess/help/mex - обратите внимание на дополнительные /help. Теперь какой из них действительно?

Я бы рекомендовал бросать прочь явную httpGetUrl в поведении службы конфигурации - просто использовать:

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

, и вы должны быть в состоянии получить MEX в http://localhost:8002/HBAccess/mex.

Марк

+0

Я просто попытался что вы предложили и веб-службы не могли до сих пор можно найти в HTTP: // локальный : 8002/HBAccess/mex URI – Nap