1

HttpListenerでは本当に理解できないことがあります。

以下のコードはそれ自体を物語っており、ある方法で「問題」を明らかにしています。

それぞれに同じ単一のプレフィックスを使用して、2つの異なるHttpListenerをインスタンス化するだけです。次に、最初のリスナーを開始します。もちろん、2番目のリスナー(同じプレフィックス)を開始しようとすると、HttpListenerExceptionが発生します。

私のせいです(または、構成ツールを使用している場合はエンドユーザーのせいです)。パニックにはなりません。2番目のリスナーのプレフィックスをクリアして新しいリスナーを指定するだけです...または最初のリスナーを停止して2番目のリスナーを再起動しようとします...

ただし、2番目のリスナープレフィックスなどにアクセスしようとするとすぐに、ObjectDisposedException(破棄されたオブジェクトにアクセスできません。オブジェクト名:'System.Net.HttpListener')が発生するため、これらすべてを実行することはできません。

私の質問はなぜですか?HttpListenerExceptionで、HttpListenerオブジェクトの内部のものが何らかの形で破棄され、その時点からオブジェクトが役に立たなくなることを指定している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
}
4

1 に答える 1

2

例外は、何かがひどく間違っていることを意味します。疑いを持たないコンシューマーが破損したり不安定になったりする可能性のあるオブジェクトを使用し続けることを許可するのではなく、代わりにそれ自体を破棄します。新しいリスナーを作成するだけで、おそらく役に立たないオブジェクトを使用することを心配する必要がないことに満足してください。

于 2012-06-22T22:29:50.070 に答える