Kestrel Web サーバーで外部からの接続を許可する - ASP.NET

Kestrel Web サーバーで外部からの接続を許可する手順を紹介します。

動作の確認

IISにホストせずに、ASP.NET Coreアプリケーションを起動すると、下図のウィンドウが表示されKestrel Web サーバーが起動します。 起動したKestrel Web サーバーのリッスンURLとポート番号が表示されます。下図の例では、httpsのバインド先はhttps://localhostのポート 7159となり、 httpのバインド先はhttp://localhostのポート 5159となります。


ASP.NET Coreアプリケーションを実行しているマシンのWebブラウザで、 https://localhost:7159にアクセスすると、ASP.NET Coreアプリケーションの実行結果を表示できます。


しかし、別のマシンで、ASP.NET Coreアプリケーションを実行しているマシンのアドレスとポート番号を指定してアクセスしても 下図の画面が表示され、ERR_CONNECTION_REFUSED によりアクセスが拒否されます。


対処方法

Kestrel Webサーバーはデフォルトの状態では、外部からのアクセスを受け付ける設定になっていないため、 設定を変更して外部からのアクセスを受け付ける動作に変更する必要があります。
設定の変更には、以下の方法があります。

方法1: appsettings.json の "urls" キーを記述する

プロジェクトの appsettings.json に "urls" キーを記述し、URLとポート番号を指定します。
以下の記述では、 http接続は、このサーバーのすべてのURLで、ポート番号5000でリッスンし、 https接続は、このーサーバーのすべてのURLで、ポート番号5001でリッスンします。
appsettings.json
{
  "urls": "http://*:5000;https://*:5001",
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

方法2: appsettings.json の "Kestrel" キーを記述する

プロジェクトの appsettings.json に "Kestrel" キーを記述し、"Endpoint"の設定を記述します。
以下の記述では、 http接続は、このサーバーのすべてのURLで、ポート番号5000でリッスンし、 https接続は、このーサーバーのすべてのURLで、ポート番号5001でリッスンします。
appsettings.json
{
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://*:5000"
      },
      "Https": {
        "Url": "https://*:5001"
      }
    }
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

方法3: Webhost.UseUrls() メソッドを呼び出す

Program.cs ファイルで、WebApplicationBuilderオブジェクトの、WebHostオブジェクトのUseUrls() メソッドを呼び出し、 パラメーターにURL、ポート番号を設定する方法です。
builder.WebHost.UseUrls("http://*:5000;https://*:5001"); のコードでURLとポート番号を指定しています。
設定内容は先のappsettings.jsonに記述したものと同様で、 http接続は、このサーバーのすべてのURLで、ポート番号5000でリッスンし、 https接続は、このーサーバーのすべてのURLで、ポート番号5001でリッスンします。
Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseUrls("http://*:5000;https://*:5001");
var app = builder.Build();

app.MapGet("/", () => "Hello ASP.NET Core World!");

app.Run();

実行結果

修正後、ASP.NET Coreアプリケーションを起動します。下図のウィンドウが表示されます。 リッスンURLが http://[::]:5000 https://[::]:5001 の表示になっています。


ASP.NET Coreアプリケーションを実行しているマシンのWebブラウザで、http://localhost:5000にアクセスします。 アプリケーションの実行結果が表示されます。


https://localhost:5001にアクセスした場合も結果が表示されます。


別のマシンから、http://(マシンのホスト名またはIPアドレス):5000 でアクセスします。修正前は ERR_CONNECTION_REFUSEDエラーで接続が拒否されましたが、アプリケーションの実行結果が表示されるようになりました。


https://(マシンのホスト名またはIPアドレス):5001 でアクセスした場合も結果が表示されます。 開発用のSSL証明書がインストールされていないため、SSLの警告は表示されます。


なお、アクセスした際に、ERR_CONNECTION_TIMED_OUTエラーで接続できない場合は、アプリケーションは接続できる状態ですが、 マシンのファイアウォールで接続を遮断している可能性がありますので、ファイアウォールの設定を変更して、アクセスするポート番号を許可するか、 実行しているASP.NET Coreアプリケーションを許可する必要があります。(または、ファイアウォールをオフにする。)


Kestrel Web サーバーで外部からの接続を許可する設定ができました。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2023-05-01
作成日: 2023-03-06
iPentec all rights reserverd.