将WCF服务公开为.NET 2.0目标客户端的Web服务时,是否真的需要basicHttpBinding?

时间:2009-06-26 09:56:24

标签: .net wcf web-services binding

我有一个WCF服务,并在Windows服务中托管它。

我尝试从基于.NET 2.0构建的Windows窗体客户端添加服务引用。我可以通过指向httpGetUrl =“http:// localhost:8002 / HBAccess / help / mex”来获取Web引用,但是当我检查Reference.cs时 - 它只包含一个没有任何内容的命名空间。

现在我添加basicHttpBinding并重复相同的步骤:

现在我可以看到Web服务的类。

我的高级同事坚持认为将httpGetEnabled设置为true就足以通过http导出WCF服务并进行适当的Web引用。

有人能指出我在这里缺少的东西吗?

<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 个答案:

答案 0 :(得分:2)

您必须指定绑定,而basicHttpBinding是唯一可与.NET 2.0客户端互操作的绑定。 .NET 2.0 ASMX客户端仅支持基于HTTP的XML,并且不支持WS- *协议。

答案 1 :(得分:2)

问题是mexHttpBinding实际上并没有暴露您的服务,它只暴露了您的服务的 defenition ,并且由于.net 2.0不了解nettcp,您会得到一个空名称空间,你需要basicHttpBinding,因为它是你的实际服务端点。

如果查看合同,您会看到mexHttpBinding的合同甚至不是"HBAcsNX.HBAccess",而是"IMetadataExchange".

答案 2 :(得分: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 - &gt; 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>

你应该可以在http://localhost:8002/HBAccess/mex获得你的MEX。

马克