Является ли basicHttpBinding действительно необходимым при представлении службы WCF в качестве веб-службы для целевого клиента .NET 2.0? - PullRequest
0 голосов
/ 26 июня 2009

У меня есть служба WCF, и я размещаю ее в службе Windows.

Я попытался добавить ссылку на службу из клиента 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 (пустая заглушка прокси с единственным пространством имен)

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

Ответы [ 3 ]

2 голосов
/ 05 июля 2009

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

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

2 голосов
/ 26 июня 2009

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

1 голос
/ 26 июня 2009

Ваш конфиг не совсем совпадает .....

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

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...