WCF基本HTTP和NetTCP绑定,通过Mex公开

时间:2011-01-25 00:31:20

标签: wcf .net-2.0 wsdl endpoint

我在配置WCF服务时遇到了一些困难。我的要求是它公开了一个basicHttpBinding端点以及一个netTcpBinding端点。我的一些客户端是.NET 2.0,需要能够通过WSDL.exe生成代理。

它似乎在很大程度上起作用 - 但是当我试图获得WSDL时,它不合作。在浏览器中,它为我提供了一些SOAP XML标记,但绝对不是完整的WSDL。 WSDL.exe给了我一系列错误:

错误:处理'http://1.2.3.4:9877/MyService/basicHttp?wsdl'时出错。

  • 该文件已被理解,但无法处理。
  • WSDL文档包含无法解析的链接。
  • 下载'http:// localhost:9877 / MyService / basicHttp?wsdl = wsdl0'时出错。
  • 基础连接已关闭:无法连接到远程服务器。

这是我的主机配置。有什么事情在这里出错吗?

<system.serviceModel>
  <services>
    <service behaviorConfiguration="MyServiceBehavior" name="MyRunner">
      <endpoint address="netTcp" binding="netTcpBinding" bindingConfiguration="" contract="IMyRunner">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
      <endpoint address="basicHttp" binding="basicHttpBinding" bindingConfiguration="" contract="IMyRunner">
      </endpoint>
      <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
      <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" />
      <host>
        <baseAddresses>
          <add baseAddress="net.tcp://localhost:9876/MyService/netTcp" />
          <add baseAddress="http://localhost:9877/MyService/basicHttp" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="MyServiceBehavior">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="false" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

2 个答案:

答案 0 :(得分:1)

如果你有两个MEX端点,每个端点需要一个单独的地址 - 调用一个“mex”,然后调用另一个“mex2”或者其他东西:

<service behaviorConfiguration="MyServiceBehavior" name="MyRunner">
      <endpoint address="netTcp" binding="netTcpBinding" bindingConfiguration="" contract="IMyRunner">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
      <endpoint address="basicHttp" binding="basicHttpBinding" bindingConfiguration="" contract="IMyRunner">
      </endpoint>
      <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
      <endpoint address="mex2" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" />
      <host>
        <baseAddresses>
          <add baseAddress="net.tcp://localhost:9876/MyService/netTcp" />
          <add baseAddress="http://localhost:9877/MyService/basicHttp" />
        </baseAddresses>
      </host>
    </service>

(好的,根据OP的评论,他不是在IIS中托管,所以这不相关)

<击> 另外:你在IIS托管?在这种情况下,您的基地址(至少是HTTP地址)毫无意义 - 服务器,虚拟目录和SVC文件的位置将决定您的服务地址:

http://YourServer/YourVirtualDirectory/SubDirectory/YourService.svc/basicHttp

表示“正常”服务端点,或

http://YourServer/YourVirtualDirectory/SubDirectory/YourService.svc/mex

用于基于HTTP的MEX端点。

答案 1 :(得分:0)

感谢提示家伙。原来问题是baseAddress值指向“localhost”。在生成的WSDL中,它仍然显示“localhost”,因此WSDL.exe显然试图访问localhost(我的开发机器)而不是服务器。我将“localhost”更改为托管服务的服务器的实际IP,并且WSDL.exe成功运行,即使在.NET 1.1中也是如此。我仍然可以使用svcutil.exe获得4.0版本。