gpt4 book ai didi

c# - IP 端点 0.0.0.0 :13000. 上已经有一个监听器 ?? (使用 WCF 的 TCP)

转载 作者:IT王子 更新时间:2023-10-29 04:52:01 25 4
gpt4 key购买 nike

我想弄清楚为什么即使在重新启动计算机后仍使用该端口!

System.ServiceModel.AddressAlreadyInUseException: There is already a listener on IP endpoint 0.0.0.0:13000. This could happen if there is another application already listening on this endpoint or if you have multiple service endpoints in your service host with the same IP endpoint but with incompatible binding configurations. ---> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net.Sockets.Socket.Bind(EndPoint localEP) at System.ServiceModel.Channels.SocketConnectionListener.Listen() --- End of inner exception stack trace --- at System.ServiceModel.Channels.SocketConnectionListener.Listen() at System.ServiceModel.Channels.TracingConnectionListener.Listen() at System.ServiceModel.Channels.ConnectionAcceptor.StartAccepting() at System.ServiceModel.Channels.ExclusiveTcpTransportManager.OnOpen() at System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener) at System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback) at System.ServiceModel.Channels.TcpChannelListener`2.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) at Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info) System.Net.Sockets.SocketException (0x80004005): Only one usage of each socket address (protocol/network address/port) is normally permitted at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net.Sockets.Socket.Bind(EndPoint localEP) at System.ServiceModel.Channels.SocketConnectionListener.Listen()

您如何确定哪个进程正在监听该端口 (13000)? Netstat 在该端口上不显示任何内容。

这是我的 App.config:

  <system.web>
<compilation debug="true" />
</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>
<services>
<service name="SomeTarget.SomeTargetService">
<endpoint address="" binding="customBinding" bindingConfiguration="NetTcpBinding"
contract="SomeTarget.ISomeTargetService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:13000" />
</baseAddresses>
</host>
</service>
</services>

<bindings>
<customBinding>
<binding name="NetTcpBinding" sendTimeout="00:05:00" closeTimeout="00:00:30" openTimeout="00:00:30" receiveTimeout="00:05:00">
<transactionFlow />
<binaryMessageEncoding />
<windowsStreamSecurity protectionLevel="None" />
<tcpTransport maxBufferPoolSize="524288"
maxReceivedMessageSize="1024"
maxBufferSize="1024" >
<connectionPoolSettings groupName="default" leaseTimeout="00:05:00"
idleTimeout="00:02:00" maxOutboundConnectionsPerEndpoint="20" />
</tcpTransport>
</binding>
</customBinding>
</bindings>

<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

</configuration>

最佳答案

我在安装 .Net 4.5 后遇到了这个问题,我在这里发布了一个解决方案,以帮助其他人遇到这个问题。 @berkayk 上面的回答有效(将 mex 暴露在不同的端口上),但我需要通过同一端口暴露两个端点。

假设您有两个端点,一个使用 netTcpBinding,一个使用 mexTcpBinding。使用默认绑定(bind)时,一些默认值是使用 OSEnvironmentHelper.ProcessorCount 计算的,而不是像在 .Net 4.0 中那样使用硬编码值。

在我的例子中,当使用命名的 netTcpBinding 绑定(bind)配置时,为 MaxConnections 属性提供的值为 20。在 NetTcpBinding 上设置 MaxConnections 属性还会将其 TcpTransportBindingElement 的 MaxPendingConnections 属性和 TcpTransport 的 ConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint 属性设置为相同的值。

当不使用命名的 netTcpBinding 绑定(bind)配置,并且仅使用默认值时,MaxPendingConnections 属性是使用以下算法计算的:

 return (12 * OSEnvironmentHelper.ProcessorCount);

mexTcpBinding 的传输还使用上述算法计算了它的 MaxPendingConnections 属性,因此当两者都没有使用命名的 bindingConfiguration 时,默认值匹配并且没有问题。

当使用命名的 netTcpBinding bindingConfiguration 时,传输的 MaxPendingConnections 是 20,而 mexTcpBinding 的传输的 MaxPendingConnections 在我的机器上是 96。共享同一端口的这两个端点之间的 MaxPendingConnections 值的差异是不兼容的。

我还发现这个问题也发生在 ListenBacklog 集上。(我不知道可能存在的所有可能的冲突值。)

要解决此问题,您可以为 mex 创建一个自定义绑定(bind),该绑定(bind)与 netTcpBinding 的命名 bindingConfiguration 相匹配。示例如下:

<endpoint binding="netTcpBinding" bindingConfiguration="TestNetTcpBinding"
contract="YourContract" />
<endpoint address="mex" binding="customBinding" bindingConfiguration="TestMexBinding"
contract="IMetadataExchange" />

<bindings>
<customBinding>
<binding name="TestMexBinding">
<tcpTransport maxPendingConnections="20" listenBacklog="20">
<connectionPoolSettings groupName="default" maxOutboundConnectionsPerEndpoint="20" />
</tcpTransport>
</binding>
</customBinding>
<netTcpBinding>
<binding name="TestNetTcpBinding" listenBacklog="20" maxConnections="20"/>
</netTcpBinding>
</bindings>

或者,您不能指定任何计算值(如 maxConnections 和 listenBacklog)并接受默认值(请注意,MaxOutboundConnectionsPerEndpoint 仍将保留默认值 10,因为它的计算方式与 MaxPendingConnections 属性的计算方式不同):

<binding name="TestNetTcpBinding" ...someOtherProperties except listenBacklog and maxConnections/>

注意:问题在此处描述:http://msdn.microsoft.com/en-us/library/aa702636.aspx ,但给出的唯一解决方案是将 mex 暴露在不同的端口上。下面是反射器中的一些屏幕截图,显示了 .net 4.0 和 4.5 在计算 MaxPendingConnections 默认值时的区别:

.Net 4.0 ConnectionOrientedTransportBindingElement Calculating default MaxPendingConnections

.Net 4.5 ConnectionOrientedTransportBindingElement Calculating default MaxPendingConnections

.Net 4.5 GetMaxPendingConnections method

关于c# - IP 端点 0.0.0.0 :13000. 上已经有一个监听器 ?? (使用 WCF 的 TCP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9744683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com