2011-08-26 109 views
1

我正尝试在同一端口上承载多个WCF REST服务。我开始Net.Tcp端口共享服务,这是我的app.config文件:WCF服务端口共享问题

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

我想的东西遗失,使端口共享?

回答

1

你所试图做的是没有意义的。 “端口共享”可通过两种方式进行:

  • 的Http:该作品(排序)从Windows上的箱子,因为HTTP通过HTTP.SYS的内核级驱动程序处理。没有什么特别的你需要去做。

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

但是你(只)端点配置为使用HTTP绑定,不是的net.tcp,绑定(这又是有道理的,如果你想使用REST式服务),那么净。 TCP端口共享不适用于此。

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

编辑

仍扑朔迷离。从您的app.config看起来好像您正在为端点使用端口80,但是您引用的错误消息说明了端口8080.无论如何,以下内容无论如何都适用。

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

例如,你可以使用下面的端点的URI:

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

+0

后,我尝试在开始第二服务相同的端口,我得到这个错误框:http://screencast.com/t/Vlakb26XbuQr。这是跟踪日志异常:http://screencast.com/t/tJ5Gvmy4Dgm7。 –

+0

您能否将错误消息添加为文本,最好是将您的问题添加到您的问题中?这样,我们这些正在遭受过度热忱的企业代理过滤的人们可以看到它们。 –

+0

我原来的帖子现在编辑了这些错误。 –

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>