C# 使用TCP承载多个端点的WCF
我在WCF上托管多个端点时遇到问题,这给了我错误: System.ServiceModel.AddressalReadyUseException:已存在一个 IP端点上的侦听器 0.0.0.0:808. 如果有另一个应用程序正在侦听此端点,或者您有多个服务端点,则可能会发生这种情况 在具有相同IP端点但不兼容的服务主机中 绑定配置。-->System.Net.Sockets.SocketException:仅限 每个套接字地址(协议/网络地址/端口)的一种用法是 通常允许在system.Net.Sockets.Socket.DoBind(端点 endPointSnapshot,SocketAddress(SocketAddress) 我的App.configC# 使用TCP承载多个端点的WCF,c#,.net,wcf,sockets,tcp,C#,.net,Wcf,Sockets,Tcp,我在WCF上托管多个端点时遇到问题,这给了我错误: System.ServiceModel.AddressalReadyUseException:已存在一个 IP端点上的侦听器 0.0.0.0:808. 如果有另一个应用程序正在侦听此端点,或者您有多个服务端点,则可能会发生这种情况 在具有相同IP端点但不兼容的服务主机中 绑定配置。-->System.Net.Sockets.SocketException:仅限 每个套接字地址(协议/网络地址/端口)的一种用法是 通常允许在system.Net.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
<system.web>
<compilation debug="true" />
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
</providers>
</roleManager>
</system.web>
<system.serviceModel>
<diagnostics wmiProviderEnabled="true">
<messageLogging logMalformedMessages="true" logMessagesAtTransportLevel="true" />
</diagnostics>
<bindings>
<netTcpBinding>
<binding name="TCPDefault" portSharingEnabled="true" />
</netTcpBinding>
</bindings>
<services>
<!--Service1-->
<service name="WCFLibrary.CalculatorService" behaviorConfiguration="DebugBehavior">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost/CalculatorService" />
</baseAddresses>
</host>
<endpoint address="" binding="netTcpBinding" bindingConfiguration="TCPDefault"
name="ServiceTCPEndPoint" contract="WCFLibrary.ICalculator">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" name="ServiceMexEndPoint"
contract="IMetadataExchange" />
</service>
<!--Service2-->
<service name="WCFLibrary.MyWorldService" behaviorConfiguration="DebugBehavior">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost/MyWorldService" />
</baseAddresses>
</host>
<endpoint address="" binding="netTcpBinding" bindingConfiguration="TCPDefault"
name="WCFLibrary.MyWorldService" contract="WCFLibrary.IMyWorld">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" name="ServiceMexEndPoint"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DebugBehavior">
<serviceMetadata/>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
I'm having separate services with callbacks. Please advise.
**Modified App.config**
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
<system.web>
<compilation debug="true" />
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
</providers>
</roleManager>
</system.web>
<!-- When deploying the service library project, the content of the config file must be added to the host's
app.config file. System.Configuration does not support config files for libraries. -->
<system.serviceModel>
<diagnostics wmiProviderEnabled="true">
<messageLogging logMalformedMessages="true" logMessagesAtTransportLevel="true" />
</diagnostics>
<bindings>
<netTcpBinding>
<binding name="TCPDefault" portSharingEnabled="true" />
</netTcpBinding>
</bindings>
<services>
<!--Service1-->
<service name="WCFLibrary.CalculatorService" behaviorConfiguration="DebugBehavior">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost/CalculatorService" />
</baseAddresses>
</host>
<endpoint address="" binding="netTcpBinding" bindingConfiguration="TCPDefault"
name="ServiceTCPEndPoint" contract="WCFLibrary.ICalculator">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="net.tcp://localhost:8002/CalculatorService/mex" binding="mexTcpBinding" name="ServiceMexEndPoint"
contract="IMetadataExchange" />
</service>
<!--Service2-->
<service name="WCFLibrary.MyWorldService" behaviorConfiguration="DebugBehavior">
<host>
<baseAddresses>
<!--<add baseAddress="net.tcp://localhost/MyWorldService" />-->
</baseAddresses>
</host>
<endpoint address="net.tcp://localhost/MyWorldService" binding="netTcpBinding" bindingConfiguration="TCPDefault"
name="WCFLibrary.MyWorldService" contract="WCFLibrary.IMyWorld">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="net.tcp://localhost:8001/MyWorldService/mex" binding="mexTcpBinding" name="ServiceMexEndPoint"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DebugBehavior">
<!-- To avoid disclosing metadata information,
set the values below to false before deployment -->
<!--<serviceMetadata httpGetEnabled="False" httpsGetEnabled="False" />-->
<serviceMetadata/>
<!-- To receive exception details in faults for debugging purposes,
set the value below to true. Set to false before deployment
to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
WindowsService:
问题似乎出在您的MEX端点上——它们在两个服务之间是相同的。尝试为他们提供不同的地址,看看这是否解决了问题。我的第一个猜测是,您有另一个应用程序在某个端口上侦听,请尝试将端口更改为类似的内容
在两个端口上尝试不同的端口
<add baseAddress="net.tcp://localhost:2200/CalculatorService" />
<add baseAddress="net.tcp://localhost/MyWorldService:2200" />
在我的例子中,我已经更新了.net framework,并且收到了这个错误。我通过删除配置文件中的listenBacklog和maxConnections属性来解决此错误
是解决我的问题的解决方案。有了它,我可以让WCF与测试客户端一起运行。但是,当我在windows服务中托管此服务时,我无法使用svcutil下载元数据。您可以准确地发布您对.config文件的修改方式,以及尝试对该服务使用svcutil时收到的错误消息吗?请检查我的编辑。当我通过服务管理器运行服务时,我使用svcutil测试服务,它还下载元数据。它说:无法从网络获取元数据。tcp://localhost/CalculatorService. 第二个endpointAFischbein的解决方案也是如此,但由于它托管在windows服务中,因此我无法从svcutil下载元数据
netstat -an