.net 新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(

我有以下测试代码,它首先尝试在无效地址上打开ServiceHost,然后在出现故障时调用
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地址在我们的应用程序中是用户可配置的,只是为了允许绑定到客户选择的特定接口或地址。因此,我们也希望允许重新配置,例如,如果他/她输入了无效地址。