IIS Express を外部公開する


背景

Mac上の仮想環境上のWindows上でAPS.Netアプリケーションを開発しているときに

  1. ゲストOS(Windows)上のIIS Expressでアプリケーションを実行
  2. ホストOS(MacOS)上のブラウザで動作を確認

したいことがあります。
クライアント側のJavaScript部分をReactなどで実装している場合、Reactの開発にはOSの縛りがありません。
ホストOS上の方がファイルの編集・実行が速いので、Reactアプリケーションの

  1. 編集
  2. ビルド

をホストOS上でしたいです。

このために、IIS ExpressをLAN上に公開したいです。

環境

  • Windows 10 Pro
  • Visual Studio Community 2015 update2
  • IIS 10.0 Express

手順

解決すべき課題

  1. IIS Expressはデフォルトでlocalhost:xxxxにバインドされる。ドメイン名やIPアドレスでアクセスできない
  2. Windowsは、ファイアーウォールで外部からのアクセスを禁止している
  3. localhost以外にバインドしてIIS Expressを起動するには管理者権限が必要

IIS Expressを任意のアドレスにバインド

applicationHost.configを編集する必要があります。Visual Studio 2015では

IIS Expressでlocalhost以外のアドレスでアクセスする方法 - なか日記

プロジェクトの設定で「すべてのユーザーにサーバー設定を適用(プロジェクト ファイルに格納)」にチェックが入っている場合は、ソリューションを保存してるフォルダにある .vs (隠しフォルダ)に applicationhost.config が格納されいる

.vs/config/applicationHost.configを編集します。

<site name="ApiServer" id="2">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="\\vmware-host\Shared Folders\shigerunakajima\slot-marketing-dashboard\ApiServer" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:56043:localhost" />
    </bindings>
</site>

のような定義があります。バインドしたいIPアドレス・ドメイン名を設定します。
IPアドレス192.168.0.65を設定したい場合は

<binding protocol="http" bindingInformation="*:56043:192.168.0.65" />

を追加します。

<site name="ApiServer" id="2">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="\\vmware-host\Shared Folders\shigerunakajima\slot-marketing-dashboard\ApiServer" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:56043:localhost" />
        <binding protocol="http" bindingInformation="*:56043:192.168.0.65" />
    </bindings>
</site>

この状態で、IIS Expressを起動します。
ゲストOS(Windows)から接続するとBad Request - Invalid Hostnameが表示されます。

回避するには Visual Studioを管理者権限で起動 します。

外部からアクセス

この時点ではホストOS外部から接続するとTimeoutします。
Windowsのファイアーウォールに阻まれます。

  1. Cortanaにfirewallと入力しエンターキーを押します。
  2. 操作(A) > 新しい規則(N)...
  3. 規則の種類ポート(O)を選択
  4. 次へ(N)をクリック
  5. 特定のローカルポート(S):56043を入力
  6. 次へ(N)をクリック
  7. 接続を許可する(A)を選択
  8. 次へ(N)をクリック
  9. この規則はいつ適用しますか?はデフォルトのまま
  10. 次へ(N)をクリック
  11. 名前(N):iis expressを入力
  12. 完了(F)をクリック

ポートや規則の名称は好きな値に設定してください。

管理者権限を使わずにIIS Expressを起動

上手くいきませんでした。

IIS Express で仮想サイトに複数のホスト名を割り当てる - しばやん雑記

netsh http add urlacl を叩けば管理者権限が要らない

と言う情報があります。実際に

netsh http add urlacl url=http://192.168.0.65:56043/ user=Everyone

を実行すると、デバック実行時にIIS Express Web サーバーを起動できません。と、表示されるようになります。
Visual Studio を管理者権限で起動すると、IIS Expressが起動できます。

次のパターンで試しました。

netsh http add urlacl url=http://192.168.0.65:56043/ user=luxiar201508\shigeru.nakajima
netsh http add urlacl url=http://192.168.0.65:56043/ user=shigeru.nakajima
netsh http add urlacl url=http://192.168.0.65:56043/ user=Administrator
netsh http add urlacl url=http://192.168.0.65:56043/ user=BUILTIN\Users
netsh http add urlacl url=http://192.168.0.65:56043/ user=BUILTIN\Administrators
netsh http add urlacl url=http://+:56043/ user=everyone

いずれも結果は同じでした。

Is netsh http add urlacl broken in Windows 10? - Microsoft Community が近いように思えます。回答はありません。

参考