为什么HttpListener Start方法在异常上处理东西?

时间:2012-06-22 22:25:04

标签: c# .net httplistener

对于HttpListener,我真的不明白。

下面的代码说明了自己并以某种方式揭露“问题”。

我只是简单地为每个HttpListener实例化两个不同的HttpListener。 然后我启动第一个监听器,当我尝试启动第二个(相同的前缀)时,我得到一个HttpListenerException ..到目前为止一直很好。

确定我的错(如果我们正在通过配置工具,则是最终用户错误)。没有恐慌,我将清除第二个侦听器的前缀并指定一个新的...或者停止第一个侦听器并尝试重新启动第二个侦听器,或者其他......

但不能完成所有这一切,因为只要我尝试访问第二个侦听器前缀或其他任何东西,我就会得到一个ObjectDisposedException(无法访问已处置的对象。对象名称:'System.Net.HttpListener')

我的问题是为什么? 我没有看到HttpListener文档中的任何内容指定在HttpListenerException上HttpListener对象的一些内部东西以某种方式被处理,并且该对象从那时起就没用了...

所以这意味着如果我启动一个HttpListener并获得一个HttpListenerException,我必须在任何情况下重新创建一个全新的HttpListener对象?对我来说似乎有点奇怪(但可能有另一种方式或非常好的理由)。

提前感谢您的回答!!

var listener1 = new HttpListener();
listener1.Prefixes.Add("http://localhost:8080/MyHandler/");
listener1.Start();

var listener2 = new HttpListener();
listener2.Prefixes.Add("http://localhost:8080/MyHandler/");

try
{
   listener2.Start();
}
catch (HttpListenerException ex)
{
  listener2.Prefixes.Clear(); // BAM ! ObjectDisposedException
}

1 个答案:

答案 0 :(得分:2)

异常意味着出现了可怕的错误。它不是让毫无戒心的消费者继续使用可能腐败和不稳定的对象,而是自行处置。只需创建新的监听器,并且您不必担心使用可能无用的对象。