HTTP.sys でポート共有

Microsoft Docs によると、HTTP.sys はポート共有をサポートしていると書いてある。

docs.microsoft.com

ただ肝心のやり方が載ってない。 見つけられないだけかも? だけど推測はできる。 おそらく、重複しない URL プレフィックスを指定してやればいいんだろう。

HTTP.sys でホストする最小限の ASP.NET Core アプリで試してみることにした。

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Server.HttpSys;

namespace PortSharingSample.Foo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseHttpSys(options =>
                {
                    options.Authentication.Schemes = AuthenticationSchemes.NTLM | AuthenticationSchemes.Negotiate;
                    options.Authentication.AllowAnonymous = true;

                    // prefix を登録する
                    // prefix が重複していなければ、ポートが同じでもホストできる
                    options.UrlPrefixes.Add("http://localhost:5000/Foo");
                });
    }

    public class Startup
    {
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello Foo!");
            });
        }
    }
}

名前空間と登録する URL プレフィックスだけが違う ASP.NET Core アプリをもう 1 つ作成。

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Server.HttpSys;

namespace PortSharingSample.Bar
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseHttpSys(options =>
                {
                    options.Authentication.Schemes = AuthenticationSchemes.NTLM | AuthenticationSchemes.Negotiate;
                    options.Authentication.AllowAnonymous = true;

                    // prefix を登録する
                    // prefix が重複していなければ、ポートが同じでもホストできる
                    options.UrlPrefixes.Add("http://localhost:5000/Bar");
                });
    }

    public class Startup
    {
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello Bar!");
            });
        }
    }
}

実行すると、5000 番のポートを共有して 2 つの ASP.NET Core アプリを起動することができた。

f:id:griefworker:20190603143341p:plain

HTTP.sys でのポート共有の方法がドキュメントで見つからなかったけど、 予想通り URL プレフィックスを登録することで上手く動いた。 予想通りだったとはいえ、こういうのはちゃんと試しておくのが大事。