2017-09-19 3 views
1

スタンドアロンアプリケーションとして実行する予定のASP.NET Core 2.0アプリケーションがあります。アプリは起動し、使用可能なポートにバインドする必要があります。これを実現するために、私はWebHostBuilderを "http://127.0.0.1:0"でリッスンし、Kestrelサーバーを使用するように設定します。 Webホストがリスニングを開始すると、URLを実際のポートでファイルに保存します。できるだけ早くこれをやりたいのですが、別のアプリケーションがファイルを読み込んでアプリケーションとやりとりするからです。動的ポート(0)が指定されたときにASP.NET Core 2がリッスンしているポートを特定する方法

ウェブホストがリッスンしているポートを特定するにはどうすればよいですか?

答えて

1

私は反射を使ってそれを行うことができます(ugh!)。私はIHostedServiceを登録し、IServerを注入しました。 KrestelServerOptionsの "ListenOptions"プロパティは内部的なので、リフレクションを使用して取得する必要があります。ホスティングサービスが呼び出されたとき、私は、次のコードを使用してポートを抽出します。

var options = ((KestrelServer)server).Options; 
var propertyInfo = options.GetType().GetProperty("ListenOptions", BindingFlags.Instance | BindingFlags.NonPublic); 
var listenOptions = (List<ListenOptions>)propertyInfo.GetValue(options); 
var ipEndPoint = listenOptions.First().IPEndPoint; 
var port = ipEndPoint.Port; 
1

あなたは方法の設定でスタートアップクラスでそれをachiveすることができます。あなたはここにServerAddressesFeature

からポートを取得することができ、コードの例です。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, ILogger<Startup> logger) 
{ 
    var serverAddressesFeature = app.ServerFeatures.Get<IServerAddressesFeature>(); 

    loggerFactory.AddFile("logs/myfile-{Date}.txt", minimumLevel: LogLevel.Information, isJson: false); 

    logger.LogInformation("Listening on the following addresses: " + string.Join(", ", serverAddressesFeature.Addresses)); 
} 
関連する問題