HttpListenerでURLを受け付ける

過去のブログのアーカイブ
この記事は前身のブログのアーカイブを引き継いだものです. 画像が正しく表示できないなど,コンテンツの表示に問題がある恐れがあります.

HttpListenerを使ってサーバーを建てたのですがlocalhostしか動作しない感じでして、いろいろ調べてみたら細かいところに罠が…
ただ私が気が付かなかっただけなんですけどね

Suffixについて

HttpListenerではURLの設定をSuffixというものでします。例えばlocalhostの80番ポートならこのような感じ
http://localhost:80/ 又は http://localhost/
…なのですが、すべてのURLを受け付けるようにしようと思ったらワイルドカードを使うことになると思います。
ただSuffixの指定ではワイルドカードは*ではなく+になるそうですね…
http://+:80/
これはHttpListenerの内部がIISと同じもの?netshによってファイアーウォールを開けることができるのですが、システム内部の動作をHttpListenerでラッパーにしてるだけのようです。
そのため、ファイアーウォールを開ける際は動作させているプログラムではなく、systemとして設定して上げる必要があるみたいです。

URLの予約

cmd-netsh-res
コマンドプロンプトにてURLの予約をすることができます。管理者権限が必要です。
URLを予約する場合は

netsh http add urlacl url=http://+:45454/ user=Everyone

逆にURLの予約を解除する場合は

netsh http delete urlacl url=http://+:45454/

もしC#コードにてURLの予約をする場合はVerbにrunasを指定して上げる必要があります。

Process proc = new Process();
proc.StartInfo.FileName = "netsh";
proc.StartInfo.Arguments = "http add urlacl url=http://+:80/ user=Everyone";
proc.StartInfo.Verb = "runas";
proc.Start();
proc.WaitForExit();

ついでに私が公開したHttpListenerのライブラリもこの方法でうまくいきました。やったね
ローカルで使うWebサーバーを立てる
Local HTTP Server Library