1

我正在尝试在同一端口上托管多个 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 无法注册 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>

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

4

2 回答 2

1

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

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

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

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

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

编辑

还是很混乱。从您app.config看来,您的端点似乎使用端口 80,但是您引用的错误消息显示端口 8080。无论如何,以下内容仍然适用。

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

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

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

于 2011-08-26T10:10:31.760 回答
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>
于 2012-01-24T23:32:17.040 回答