我试图弄清楚为什么即使在重新启动计算机后仍在使用该端口!
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超时) 在System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan超时) 在System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan超时) 在System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan超时) 在System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan超时) 在System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan超时) 在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()
如何确定哪个进程正在侦听该端口(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>
答案 0 :(得分:27)
我在安装.Net 4.5之后遇到了这个问题,并且我在这里发布了一个解决方案来帮助其他人,如果他们偶然发现它。 @ berkayk上面的答案有效(在不同的端口上暴露mex),但我需要通过同一个端口公开两个端点。
假设您有两个端点,一个使用netTcpBinding,另一个使用mexTcpBinding。 使用默认绑定时,某些默认值是使用OSEnvironmentHelper.ProcessorCount而不是.Net 4.0中的硬编码值计算的。
在我的例子中,当使用命名的netTcpBinding bindingConfiguration时,为MaxConnections属性提供的值为20.在NetTcpBinding上设置MaxConnections属性还将它的TcpTransportBindingElement的MaxPendingConnections属性和TcpTransport的ConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint属性设置为相同的值。
如果不使用命名的netTcpBinding bindingConfiguration,并且仅使用默认值,则使用以下算法计算MaxPendingConnections属性:
return (12 * OSEnvironmentHelper.ProcessorCount);
mexTcpBinding的传输也使用上面的算法计算了它的MaxPendingConnections属性,所以当两者都没有使用命名的bindingConfiguration时,默认值匹配并且没有问题。
当使用命名的netTcpBinding bindingConfiguration时,传输的MaxPendingConnections为20,并且mexTcpBinding的传输的MaxPendingConnections在我的机器上为96.共享同一端口的这两个端点之间的MaxPendingConnections值的差异是不兼容的。
我还发现此问题也发生在ListenBacklog集中。 (我不知道可能存在的所有可能存在的冲突值。)
要解决此问题,您可以为mex创建与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。下面是反射器中的一些截图,显示了计算MaxPendingConnections默认值时.net 4.0和4.5之间的区别:
答案 1 :(得分:14)
安装Visual Studio 2012进行评估后,我遇到了同样的问题。似乎普通服务和mex服务不能共享相同的端口,因为它曾经在.NET 4.0中使用相同的配置文件(我不知道为什么,必须有一个原因)。简而言之,我在不同程序集上的不同程序集和wpf应用程序上有我的服务客户端引用。我用不同的端口发布了mex
<service name="X.XService.XService" behaviorConfiguration="myServiceBehavior">
<endpoint address="" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IXService" contract="X.XService.IXService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="net.tcp://localhost:9103/XService/mex" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:9102/XService" />
</baseAddresses>
</host>
</service>
我的服务参考程序集配置
<endpoint address="net.tcp://localhost:9103/XService/mex"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IXService"
contract="XService.IXService" name="NetTcpBinding_IXService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
最后我的客户端应用配置
<endpoint address="net.tcp://localhost:9102/XService" binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IXService" contract="XService.IXService"
name="NetTcpBinding_IXService" behaviorConfiguration="endPointBehavior">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
答案 2 :(得分:5)
您确定您的服务是唯一一个收听端口13000的服务吗?
在启动程序之前运行netstat -noa | find "13000"
以确定哪个进程打开了端口13000。最右侧列中的数字将是进程ID。
然后运行tasklist | find "<pid>"
,其中是上一个命令的进程ID。这将告诉您哪个进程有13000个打开。
答案 3 :(得分:4)
netsat -anb
(需要管理员权限)会告诉你在所有端口上监听什么...如果没有显示任何内容你可能有一个错误,你试图多次创建端点。
答案 4 :(得分:2)
您是否安装了.Net Framework 4.5 beta?我在使用4.5的机器上运行时遇到了同样的错误,而它在4.0上完美运行。但是如果我删除mex端点,它会再次起作用。
在我的情况下,4.5更改中的某些内容导致了相同的错误消息。可能是创建了自动mex端点或其他东西。
没有看到任何其他使用该端口的应用程序,netstat什么都没显示。所以这是某种自我否定......
答案 5 :(得分:-1)
嗯......当我将目标框架更改为.Net framework 4 Client Profile时,我工作了。
尝试一下......希望它也适合你!