HttpListenerを使うときに「アクセスが拒否されました」と怒られる話

解決策としては、アプリケーションを管理者権限で起動するか、netshで穴を開ける。後者しか知らなかった。

名前空間予約では、HTTP URL 名前空間の一部に対する権限を特定のユーザー グループに割り当てます。 予約によって、名前空間のその部分でリッスンするサービスを作成する権限をユーザーに与えます。

HTTP および HTTPS の WCF の構成 | Microsoft Docs

実行中のアプリケーションは、同様の要求を作成して、名前空間登録を追加できます。 名前空間の同じ部分について、登録と予約の間で競合が発生します。 ワイルドカードを含む名前空間クレーム間の解決順序で指定された解決順序に従って、予約が登録より優先される可能性があります。 この場合、実行中のアプリケーションがクレームを受信する動作が、予約によってブロックされます。

HTTP および HTTPS の WCF の構成 | Microsoft Docs
  • HttpListener(たぶんWCFIISも)でlistenするためには、生のソケットを使うときにOSに対して登録するように、HTTP.sys(たぶん)に登録をする必要がある
  • 生ソケットと違い、基本的には管理者にしか許可されていない -> 管理者権限で起動すればいい
  • もしくはprefixごとにどのユーザーにlistenさせるか*1予約をしておく -> netsh

相変わらず自分が理解できるのか不安になるのだけど、これが噂のMSDN語なんですかね。

参考

これは、サーバーとして使っている HttpListener クラスを実行する権限...というか、サーバーのポートを開ける権限は Windows 8 では制限されているからなのです。Windows 7 でも制限されているので、IIS ではなくて、HttpListener を使う時には覚えておくとい良いテクニックです(って定番か?)。

http://www.moonmile.net/blog/archives/3516

B. By default only SYSTEM or the local Administrators group can listen to http prefixes

So... if your app is running under the user's account, you need to explicitly grant access (using httpcfg.exe or netsh) because your HTTPHandler uses the HTTP.sys to share ports with the running webserver (so you can host your own web app on port 80 while IIS is running on port 80 as well).

windows - C# HttpListener without using netsh to register a URI - Stack Overflow

*1:誰に待ちうけさせるかというより、誰に待ち受けを許可するかというACLの変更のような気がするけど、確かな情報が見つからない