我在 service.msc 服务列表中编写并部署了一项服务。然后我写了一个测试客户端来测试一些功能。基本的“第一次”尝试完美无缺。问题是当我返回并添加新操作时,我不断收到以下错误:
System.ServiceModel.AddressAlreadyInUseException:IP 端点 0.0.0.0:8080 上已经有一个侦听器。如果有另一个应用程序已经在侦听此端点,或者您的服务主机中有多个服务端点具有相同的 IP 端点但绑定配置不兼容,则可能会发生这种情况。---> System.Net.Sockets.SocketException:在 System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) 中,每个套接字地址(协议/网络地址/端口)通常只允许使用一次。 System.ServiceModel.Channels.SocketConnectionListener.Listen() 处的 Net.Sockets.Socket.Bind(EndPoint localEP) --- 内部异常堆栈跟踪的结束 --- System.ServiceModel.Channels.SocketConnectionListener.Listen() 处。 ServiceModel.Channels.ConnectionAcceptor。
我遵循的过程如下所示:
- 我停止了服务以释放 .exe 文件。
- 我使用 'installutil /u ...' 来卸载我的服务。
- 我将所需的功能添加到服务库中。
- 我重建了库,然后重建了 Windows 服务。
- 我使用“installutil ...”来安装服务。
- 我使用 service.msc 来启动服务(即 Autostart)。
- 我尝试将服务引用更新到 TestClient 和 Boom - 错误。
- 我再次执行了第 1-7 步,但这次更改 /mex 和默认服务地址以使用不同的端口(根据:http: //msdn.microsoft.com/en-us/library/aa702636.aspx
- 再次执行第 7 步并且 Boom - 再次出错
我又对服务进行了几次调整和摆弄,重写了客户端等。似乎没有任何效果。有趣的是第一次尝试效果很好,现在出现了问题。我已经使用“netstat -aon”和“tasgmgr.exe”确保我的服务是其端口上唯一的服务。这些看起来都很好。主机运行,测试客户端的一切都很好。现在端点使用不同的端口,因此应该根据在线文档解决 TCP Mex 问题。我在这里错过了什么吗?我能够使用“svcutil”生成代理,并确保 App.Config 数据不冲突。
下面是 App.Config 数据(因为我正在使用配置文件):
HOST App.Config(服务):
<service name="SomeServiceLib.SomeService">
<endpoint address="net.tcp://localhost:8080/SomeService" binding="netTcpBinding" contract="SomeServiceLib.ISomeService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="net.tcp://localhost:8081/SomeService/mex" binding="mexTcpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- NOTE: If net.tcp, must set each to false to avoid exception -->
<serviceMetadata httpGetEnabled="False" httpsGetEnabled="False"/>
<!-- 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="False" />
</behavior>
</serviceBehaviors>
</behaviors>
客户端应用程序配置:
<client>
<endpoint address="net.tcp://localhost:8080/SomeService"
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_SomeService"
contract="SomeService"
name="Svc_DefaultEndpoint">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="net.tcp://localhost:8081/SomeService/mex"
binding="mexTcpBinding"
contract="IMetadataExchange"
name="Svc_MexEndpoint">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_SomeService" />
</netTcpBinding>
</bindings>
...