【问题标题】:WCF Service Port Sharing problemWCF服务端口共享问题
【发布时间】:2011-08-26 10:01:22
【问题描述】:

我正在尝试在同一个端口上托管多个 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“本地计算机上的 Service 服务启动然后停止。如果某些服务没有被其他服务或程序使用,它们会自动停止”。

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

编辑:

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

我想启用端口共享时缺少某些东西?

【问题讨论】:

    标签: wcf rest service port tcpportsharing


    【解决方案1】:

    您尝试做的事情毫无意义。 “端口共享”可以通过两种方式发生:

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

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

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

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

    编辑

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

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

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

    请注意,这与 Net.Tcp 端口共享相同 - 您可以共享 端口,但不能共享完整(唯一)端点 URI。因此名称名称“端口”共享。它不是透明的负载均衡机制之类的。

    【讨论】:

    • 在我尝试在同一个端口上启动第二个服务后,我得到这个错误框:screencast.com/t/Vlakb26XbuQr。这是跟踪日志异常:screencast.com/t/tJ5Gvmy4Dgm7.
    • 您能否将错误消息添加为文本,最好添加到您的问题中,好吗?通过这种方式,我们这些饱受公司代理过滤过度困扰的人可以看到它们。
    • 我的基地址是一样的,但是端点地址不一样,看看:screencast.com/t/HVd91WoThQU(在原帖中编辑)。一旦我将第二个服务的端口更改为 7779,它就可以完美运行。
    • screencast.com/t/rutAOcQYvEZ 的图像 (a) 显示的不是您的问题所显示的,是 (b) 显然不是完整的 system.serviceModel 配置部分(尽管我认为这在在这种情况下,它是“糟糕的风格”)并且(c)使用(再次)与您在问题中引用的端口和服务名称不同的端口和服务名称。真的很难帮助事情一直在变化,并且没有得到充分和一致的展示。我建议您在问题中提供完整的(最好是自包含的)示例,包括完整的配置、错误消息等。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-09
      • 1970-01-01
      • 2014-07-02
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 2011-03-20
      相关资源
      最近更新 更多