我正在尝试在同一端口上托管多个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>
我认为缺少启用端口共享的东西?
答案 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>