【C#】.NET6のConfigureKestrelどこいった?

.NET 5 → 6でホストの実装スタイルが変わりました。

今までやっていたあの設定はどこでできる?みたいな状態なので少しまとめてみました。

MagicOnion + IPC の設定で UseKestrel していましたが設定どこ行った…?

// .NET 5
internal partial class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        string socketPath = SharedProject.SampleDef.SocketPath;
        
        IHostBuilder host = Host.CreateDefaultBuilder(args);
        host.ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
            webBuilder.ConfigureKestrel(options => // ★★★これどこ行った?
            {
                if (File.Exists(socketPath))
                {
                    File.Delete(socketPath);
                }
                options.ListenUnixSocket(socketPath, listenOptions =>
                {
                    listenOptions.Protocols = HttpProtocols.Http2;
                });
            });
        });
        return host;
    }
}

答えは、WebApplicationBuilder の WebHost.ConfigureKestrel に同じ処理があります。

// .NET 6
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);

// ★★ここに移動している
builder.WebHost.ConfigureKestrel(options =>
{
    string socketPath = SharedProject.SampleDef.SocketPath;
    if (File.Exists(socketPath))
    {
        File.Delete(socketPath);
    }
    options.ListenUnixSocket(socketPath, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http2;
    });
});

ちなみに UseStartup を使用するスタイルは消滅したみたいです。IServiceCollection は Startup で設定するのではなく WebApplicationBuilder.Services が IServiceCollection なのでそこに設定を行います。IApplicationBuilder は WebApplicationBuilder をビルドして作成される WebApplication で代替できます。

// .NET 5
public class Startup
{
    // ★(1)
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddGrpc();
        services.AddMagicOnion();
    }

    // ★(2)
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

// ↓ ↓ ↓ ↓ ↓ ↓

// .NET 6
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);

// ★(1) Startup.ConfigureServicesはWebApplicationBuilderに引っ越し
builder.Services.AddGrpc();
builder.Services.AddMagicOnion();

// ★(2) Startup.ConfigureはWebApplicationに引っ越し
WebApplication app = builder.Build();
if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}

「最上位レベルのステートメント」が見慣れないせいか違和感がすごいですが、次からの標準はこれで行くというらしいのでしばらく使って慣れていきたいと思います。暫くは何がどこにあるのか混乱しそうです。

関連記事

takap-tech.com