.net 新ServiceHost的地址是否始终与旧ServiceHost相同?
我有以下测试代码,它首先尝试在无效地址上打开ServiceHost,然后在出现故障时调用.net 新ServiceHost的地址是否始终与旧ServiceHost相同?,.net,wcf,.net-4.5,.net,Wcf,.net 4.5,我有以下测试代码,它首先尝试在无效地址上打开ServiceHost,然后在出现故障时调用Abort()和Dispose(后者可能不是必需的)。然后,它创建一个新的ServiceHost并尝试在另一个(有效)地址上打开它,但它仍然生成一个错误,指出旧地址无效 class Program { static void Main(string[] args) { TestHost("net.tcp://0.0.0.1:8081/TestUri"); TestHost(
Abort()
和Dispose
(后者可能不是必需的)。然后,它创建一个新的ServiceHost并尝试在另一个(有效)地址上打开它,但它仍然生成一个错误,指出旧地址无效
class Program
{
static void Main(string[] args)
{
TestHost("net.tcp://0.0.0.1:8081/TestUri");
TestHost("net.tcp://0.0.0.0:8081/TestUri");
}
static void TestHost(string address)
{
ServiceHost host = null;
try
{
host = new ServiceHost(typeof(MyContract), new Uri(address));
host.Open();
Console.WriteLine("Host opened successfully");
host.Close();
}
catch (Exception ex)
{
if (host != null)
{
host.Abort();
((IDisposable)host).Dispose();
}
Console.WriteLine(ex.Message);
}
}
}
[ServiceContract]
public interface IMyContract
{
[OperationContract]
void Method();
}
class MyContract : IMyContract
{
public void Method()
{
Console.WriteLine("Method Called");
}
}
这将生成以下输出:
A TCP error (10049: The requested address is not valid in its context) occurred while listening on IP Endpoint=0.0.0.1:8081.
A TCP error (10049: The requested address is not valid in its context) occurred while listening on IP Endpoint=0.0.0.1:8081.
请注意,两个错误中的端点是相同的。(如果我反转操作,第一个调用将成功,第二个调用将失败)
这里似乎有一些缓存,但我如何才能清除它并让新的ServiceHost使用我提供的地址而不是旧地址 我不知道为什么会发生这种情况,但是解决这种情况的方法是在有效调用的URI中指定一个端口
host = new ServiceHost(typeof(MyContract), new Uri("net.tcp://0.0.0.0:8081/TestUri"));
或者,您可以在第一次调用时指定一个特定端口。我也不确定自己是否有什么帮助,只是指出其他人也有类似的问题,但没有明显的解决方案
Close()
不会立即关闭整个堆栈,直到实际的套接字;它可能在几秒钟后发生。通常情况下,当您尝试在关闭端口后立即重新打开端口时,这会显示为错误,表示端口正在使用中。我想知道您的测试代码中是否发生了类似的事情,第二个调用试图重新打开前一个主机,因为它仍然在某个地方浮动,直到它被清理干净。尝试在调用TestHost
和/或强制垃圾收集之间设置延迟,看看这是否会改变行为
问题:您需要绑定到特定的IP地址吗?在什么情况下它可能无效,并且您可以重试其他地址?您是否可以绑定到所有地址(例如:net。tcp://localhost:8081/TestUri)?奇数。特殊的“0.0.0.0”地址是否不支持默认端口号?似乎与此无关。我修改了代码以包含端口号,结果仍然相同。我还尝试了其他地址,如127.0.0.1或我的实际IP地址,结果相同。(对于其他无效地址,如255.255.255.0或类似地址)这没有帮助。嗯,如果第二次调用指定的端口与第一次失败调用的端口不同,显然是这样。这很烦人。谢谢你的链接,尽管你说他们没有提供一个明确的解决方案。不幸的是,在
Close()
调用后等待或执行GC.Collect()不会改变任何情况。IP地址在我们的应用程序中是用户可配置的,只是为了允许绑定到客户选择的特定接口或地址。因此,我们也希望允许重新配置,例如,如果他/她输入了无效地址。