ASP.NET Core開発でIIS Expressに外部ホストからアクセスする方法

この記事は公開から3年以上経過しています。

ASP.NET Core開発でIIS Express(Kestrel)にアクセスする場合、既定では開発端末上からhttp://localhost:ポート番号のようなローカルホスト名でしかアクセスできないが、これをhttp://192.168.1.100:ポート番号のようなIPアドレスを使いつつ、外部ホストからアクセスする方法。


問題

ASP.NET CoreのIIS ExpressにホストIPアドレスを使ってアクセスすると

Bad Request – Invalid Hostname
HTTP Error 400. The request hostname is invalid.

のようなエラーが発生してページを表示できない。


対応

以下の手順でIISのバインディングアドレスの変更とURLプレフィックスの予約、ファイアウオールルールの追加を行う。

本例ではHTTP接続で、ローカルIP192.168.1.100、ASP.NET Coreアプリケーションのポート番号62820を例に説明します。IPアドレスやポート番号等は、お使いの環境に合わせて適宜修正してください。

  1. ソリューション名\.vs\プロジェクト名\config\applicationhost.configファイル内のXPath

    /configuration/system.applicationHost/sites/site[@name="プロジェクト名.Server"]/bindings/binding/@bindingInformation

    の値を*:62820:localhostから*:62820:192.168.1.100に変更する。

    <bindings>
        <!-- <binding protocol="http" bindingInformation="*:62820:localhost" /> -->
        <binding protocol="http" bindingInformation="*:62820:192.168.1.100" />
    </bindings>
  2. Visual Studioのプロジェクト名.ServerのプロパティWebサーバーの設定からアプリURLを変更する。
    file

  3. 管理者権限のコマンドプロンプトで以下のコマンドを実行してURLプレフィックスを予約する。

    netsh http add urlacl url=http://192.168.1.100:62820/ user=Everyone

    成功すると以下のように表示される。

    URL 予約を正常に追加しました
  4. 引き続き管理者権限のコマンドプロンプトで以下のコマンドを実行してファイアウオールルールを追加する。

    netsh advfirewall firewall add rule name= "ASP.NET Core WASM App" dir=in action=allow protocol=TCP localport=62820

    成功すると以下のように表示される。

    OK


結果

起動中のIIS Expressがある場合は停止してからデバッガを起動すると、以下のように設定したIPアドレスに外部ホストから接続ができるようになります。

file
Linux上に構築したKVMのゲストWindows開発環境のBlazor WebAssemblyアプリケーションに、ホストのブラウザからアクセスしている図。

開発が終わるなどIPアドレスによるアクセスが不要になった場合はapplicationhost.configのIPアドレスをlocalhostに戻したうえで

netsh http delete urlacl url=http://192.168.1.100:62820/
netsh advfirewall firewall delete rule name= "ASP.NET Core WASM App"

を実行してURLプレフィックスの予約取り消し、およびファイアウオールルールの削除を行なってください。


参考ウェブサイトなど

Microsoft Docs
ASP.NET Core での HTTP.sys Web サーバーの実装:Windows Server を構成する

Microsoft Docs
Netsh http コマンド:add urlacl

Microsoft Docs
netsh ファイアウォールの代わりに netsh advfirewall ファイアウォールを使用して、ファイアウォールWindows制御する

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする