如何避免引发AddressAlreadyInUseException?

时间:2009-08-17 16:45:59

标签: .net wcf sockets

我正在运行WCF服务,如果地址是..err ..正在使用,调用ServiceHost的Open()方法将引发一个AddressAlreadyInUseException!

有没有办法测试地址是否可用而不会引发异常?

4 个答案:

答案 0 :(得分:3)

ServiceHost使用的地址列在ServiceHost.BaseAddresses中。在打电话之前,您可以在那里查看。

或者,只是尝试打开服务,并正常捕获并处理AddressAlreadyInUseException。如果你收到了,你知道它正在使用中,你可以转到你的二级逻辑。

答案 1 :(得分:3)

您可以尝试WCF端点配置的一些鲜为人知的功能:ListenUriMode.Unique。 Skonnard对此非常了解: http://www.pluralsight.com/community/blogs/aaron/archive/2006/04/24/22610.aspx

我不知道这是否会处理您当前的情况(我不知道它是否会检测到碰撞以及您是否可以将其更换为不同的地址),但它可能会。 / p>

如果您没有将端点地址传达给客户端(数据库等)的集中方式,这也可能不是一个可行的解决方案。 WS-Discovery将有一种解决此限制的方法,但您必须等到.NET 4.0或使用WCF 3.5的一个开源实现。

答案 2 :(得分:1)

你不能。

考虑代码:

        if( AddressIsFree( addr ) )
        {
            OpenServiceOn( addr );
        }

如果在您的支票和打开服务之间的某个小时内注册了其他东西,会发生什么?这是竞争条件。

处理此问题的正确方法是尝试打开端口,如果失败则捕获异常,并做一些补偿。例外也不错。它们部分地存在于这个确切的原因。没有理由尝试进行大量检查以确保不会抛出异常 - 在大多数情况下,只需尝试操作,并在发生异常时捕获异常。

他们通常没有更多的代码。

答案 3 :(得分:0)

如果这有助于任何人。尝试在控制台应用程序中托管wcf服务时遇到了同样的问题。我所做的是打开wcf服务库的属性(Alt + Enter或右键单击>属性),然后转到属性窗口中的WCF选项选项卡,并取消选中“在同一解决方案中调试另一个项目时启动WCF服务主机”。问题得到解决。