IP 端点 0.0.0.0:13000 上已经有一个侦听器.??(TCP 使用 WCF) [英] There is already a listener on IP endpoint 0.0.0.0:13000. ?? (TCP using WCF)

查看:19
本文介绍了IP 端点 0.0.0.0:13000 上已经有一个侦听器.??(TCP 使用 WCF)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to figure out why the port is being used even after restarting the computer!

System.ServiceModel.AddressAlreadyInUseException: IP 端点 0.0.0.0:13000 上已经有一个侦听器.如果有另一个应用程序已经在侦听此端点,或者如果您的服务主机中有多个服务端点具有相同的 IP 端点但绑定配置不兼容,则可能会发生这种情况.---> System.Net.Sockets.SocketException:通常每个套接字地址(协议/网络地址/端口)只允许使用一次在 System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)在 System.Net.Sockets.Socket.Bind(EndPoint localEP)在 System.ServiceModel.Channels.SocketConnectionListener.Listen()--- 内部异常堆栈跟踪结束 ---在 System.ServiceModel.Channels.SocketConnectionListener.Listen()在 System.ServiceModel.Channels.TracingConnectionListener.Listen()在 System.ServiceModel.Channels.ConnectionAcceptor.StartAccepting()在 System.ServiceModel.Channels.ExclusiveTcpTransportManager.OnOpen()在 System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener)在 System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback)在 System.ServiceModel.Channels.TcpChannelListener`2.OnOpen(TimeSpan timeout)在 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)在 System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout)在 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)在 System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)在 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)在 Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info)System.Net.Sockets.SocketException (0x80004005):通常每个套接字地址(协议/网络地址/端口)只允许使用一次在 System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)在 System.Net.Sockets.Socket.Bind(EndPoint localEP)在 System.ServiceModel.Channels.SocketConnectionListener.Listen()

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 在该端口上没有显示任何内容.

How do you figure out which process is listening to that port (13000)? Netstat shows nothing on that port.

这是我的 App.config:

Here's my 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),但我需要通过同一个端口公开两个端点.

I experienced this issue after installing .Net 4.5 and am posting a solution here to help others if they stumble into it. @berkayk's answer above worked (exposing the mex on a different port), but I needed to expose both endpoints through the same port.

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

Assume you have two endpoints, one using netTcpBinding and one using mexTcpBinding. When using the default bindings, some of the defaults are calculated using OSEnvironmentHelper.ProcessorCount instead of hard coded values as they were in .Net 4.0.

在我的例子中,当使用命名的 netTcpBinding bindingConfiguration 时,为 MaxConnections 属性提供的值为 20.在 NetTcpBinding 上设置 MaxConnections 属性也会将它的 TcpTransportBindingElement 的 MaxPendingConnections 属性和 TcpTransport 的 ConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint 属性设置为相同的值.

In my case, when using a named netTcpBinding bindingConfiguration, the value supplied for the MaxConnections property was 20. Setting the MaxConnections property on the NetTcpBinding also sets it's TcpTransportBindingElement's MaxPendingConnections property and the TcpTransport's ConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint property to the same value.

当不使用命名的 netTcpBinding bindingConfiguration 并且只使用默认值时,MaxPendingConnections 属性是通过使用以下算法计算的:

When not using a named netTcpBinding bindingConfiguration, and only using the default, the MaxPendingConnections property was calculated by using the following algorithm:

 return (12 * OSEnvironmentHelper.ProcessorCount);

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

The mexTcpBinding's transport also calculated it's MaxPendingConnections property using the above algorithm, so when neither is using a named bindingConfiguration the default values match and there is no issue.

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

When using a named netTcpBinding bindingConfiguration, the transport's MaxPendingConnections was 20, and the mexTcpBinding's transport's MaxPendingConnections was, on my machine, 96. The difference in values for the MaxPendingConnections between these two endpoints sharing the same port is incompatible.

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

I also found that this issue occurred with the ListenBacklog set as well. (I do not know of all the possible conflicting values that may exist.)

要解决此问题,您可以为 mex 创建一个与 netTcpBinding 的命名 bindingConfiguration 匹配的自定义绑定.下面的例子:

To resolve the issue, you can create a custom binding for mex that matches the named bindingConfiguration for netTcpBinding. Example below:

<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 属性不同):

Or, you can not specify any values that are calculated (like maxConnections and listenBacklog) and accept the defaults (note that MaxOutboundConnectionsPerEndpoint will still retain the default value of 10 as it is not calculated in the same way that the MaxPendingConnections property is):

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

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

Note: The issue is described here: http://msdn.microsoft.com/en-us/library/aa702636.aspx, but the only solution given is to expose the mex on a different port. Below are some screenshots in reflector that show the difference between .net 4.0 and 4.5 when calculating the MaxPendingConnections defaults:

这篇关于IP 端点 0.0.0.0:13000 上已经有一个侦听器.??(TCP 使用 WCF)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆