WCF服务端口共享问题

时间:2011-08-26 10:01:22

标签: wcf rest service port tcpportsharing

我正在尝试在同一端口上托管多个WCF REST服务。我启动了Net.Tcp端口共享服务,这是我的app.config文件:

<?xml version="1.0"?>
<configuration>

  <system.serviceModel>    
    <services>  
      <service name="MyService">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/services/"/>
          </baseAddresses>
        </host>

        <endpoint
          address="test"
          binding="webHttpBinding"
          contract="IMyService"/>
      </service>
    </services>

    <behaviors>
      <endpointBehaviors>
        <behavior>
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>

    <bindings>
      <netTcpBinding>
        <binding name="PortSharingEnabled" portSharingEnabled="true">
        </binding>
      </netTcpBinding>
    </bindings>

  </system.serviceModel>

</configuration>

我仍然无法在同一端口上托管两个服务。

当我尝试运行第二个服务时,出现以下错误:http://screencast.com/t/Vlakb26XbuQr“本地计算机上的服务服务已启动然后停止。如果某些服务未被其他服务或程序使用,则会自动停止”。

跟踪日志(http://screencast.com/t/tJ5Gvmy4Dgm7)说: “HTTP无法注册网址http://+:7778/MyServiceName/。另一个应用程序已使用 HTTP.SYS 注册了此网址。”

修改

<services>
  <service name="Service1">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:7778/"/>
      </baseAddresses>
    </host>
    <endpoint
      address="first"
      binding="webHttpBinding"
      contract="IService1"/>
  </service>
  <service name="Service2">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:7778/"/>
      </baseAddresses>
    </host>
    <endpoint
      address="second"
      binding="webHttpBinding"
      contract="IService2"/>
  </service>
</services>

我认为缺少启用端口共享的东西?

2 个答案:

答案 0 :(得分:1)

你试图做的事情毫无意义。 “端口共享”可以通过两种方式实现:

  • Http:这在Windows上开箱即用(因为HTTP)由HTTP.SYS内核级驱动程序处理。你不需要做任何特别的事情。

  • Net.Tcp端口共享。这需要概述here的步骤。

但是,您的(唯一)端点配置为使用HTTP绑定,而不是Net.Tcp-Binding(如果您想使用REST样式的服务,这反过来又有意义),因此Net.Tcp端口共享是这里不适用。

如果没有关于您想要做什么的更多信息,您看到的错误,很难提供帮助。

修改

仍然令人困惑。从您的app.config看起来好像您正在使用端口80作为端点,但是您引用的错误消息显示端口8080.无论如何,以下内容仍适用。

根据您提供的错误消息,您似乎尝试使用完全相同的端点URI注册/启动服务两次。这不行。您可以重用hostname:port部分,甚至部分路径,但完整的URI必须是唯一的。

例如,您可以使用以下端点URI:

请注意,Net.Tcp端口共享也是如此 - 您可以共享端口,但不能共享完整(唯一)端点URI。因此名称“port”共享。它不是透明的负载平衡机制等。

答案 1 :(得分:0)

即使有一个公认的答案,我也会把它扔出去,因为我在以编程方式定义服务时遇到了类似的问题。我通过以下方式创建服务:

_serviceHost = new ServiceHost(_cmdService, new Uri(_serviceAddress));

ServiceEndpoint endPoint =
    _serviceHost.AddServiceEndpoint(typeof(IHttpCmdService), _binding, _endpointAddress);
endPoint.Behaviors.Add(new WebHttpBehavior());

令人惊讶的是,当我尝试使用相同的_serviceAddress和不同的_endpointAddress值多次执行此操作时,它会失败。但是如果我将整个地址放入_serviceAddress它就会成功。两种方法最终都使用相同的最终服务URL。

所以,知道这一点我想知道你是否使用不同的baseAddress值创建服务,它是否会成功启动,所以它看起来像这样:

<services>
  <service name="Service1">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:7778/first/"/>
      </baseAddresses>
    </host>
    <endpoint
      address=""
      binding="webHttpBinding"
      contract="IService1"/>
  </service>
  <service name="Service2">
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:7778/second/"/>
      </baseAddresses>
    </host>
    <endpoint
      address=""
      binding="webHttpBinding"
      contract="IService2"/>
  </service>
</services>