shuhelohelo’s blog

Xamarin.Forms多めです.

ASP.NET Core 2.2→3.0への移行 メモ

(2019.10.08)5月にメモとして書いたときと比べ,現時点では.NET Coreが3.0がリリースされており,下のリンクの公式サイトの解説も充実していると思うのでご注意ください.

docs.microsoft.com

ASP.NET Core 3.0では2.2と比べていろいろと書き方が変わっている。 なので、ASP.NETの参考書や公式チュートリアルを読むときに適宜変更する必要がある。

ライブラリが統合

↓内に統合

IserviceCollectionの拡張メソッド追加

Startup.ConfigureServicesにおいて、以下の3つのトップレベIServiceCollection拡張メソッドが利用可能になった。

Core 3.0のテンプレートではUseMvcの代わりにこれらを使用するようになった。

  • AddControllers WebAPIの場合

  • AddControllersWithViews WebAPI、View(Pageは除く)の場合

  • AddRazorPages Razor Pageを使う場合

これらは以下のように複数一緒に使える。 ちなみに、これはASP.NET Core 2.2でAddMvcを呼ぶのと同じ。

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddRazorPages();
}

もし、UseMvcまたはUseSignalRを使っている場合は、エンドポイントルーティングに移行したらいい。可能なら。

Startup.Configureの移行

一般的には以下のようにする。

  • UseRoutingを追加しろ。
  • UseStaticFilesを使っているなら、UseStaticFilesをUseRoutingよりも前に置け。
  • 認証・認可機能があるなら、例えば、AuthorizePageとか[Authorize]、UseAuthenticationとUseAuthorizationをUseRoutingの後に置け
  • CORS機能を使うなら、例えば、[EnableCors]、UseCorsを認証・認可の後ろに置け
  • UseMvcやUseSignalRをUseEndointsで置き換えろ。

これ(2.2)↓を

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseStaticFiles();
    
    app.UseAuthentication();

    app.UseSignalR(hubs =>
    {
        hubs.MapHub<ChatHub>("/chat");
    });

    app.UseMvc(routes =>
    {
        routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
    });
}

こう(3.0)だ

public void Configure(IApplicationBuilder app)
{
    ...

    app.UseStaticFiles();//UseRoutingよりも前に
    
    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();
    app.UseCors();//認証・認可の後ろ

    app.UseEndpoints(endpoints =>//UseMvcの代わりに
    {
        endpoints.MapHub<ChatHub>("/chat");
        endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
    });
}

UseCorsはすべてのエンドポイントに対して有効。 もし、CORSを任意のControllerで無効にしたい場合は[DisableCors]属性をつける。

ASP.NET Core 3.0ではAuthorizationミドルウェアが必須になった。 UseAuthentcationUseAuthorizationの直前におくこと。 Core 3.0以降は、UseAuthorizationStartup.Configureで呼ばれる。

例えば、以下のHomeControllerはサインインを要求する。

public class HomeController : ControllerBase
{
    [Authorize]
    public IActionResult BuyWidgets()
    {
        ...
    }
}

ASP.NET Core 3.0でUseMvcUseMvcWithDefaultRouteを使いたい場合は、Startup.ConfigureServices明示的にEnableEndpointRoutingをOffに設定する必要がある。

services.AddMvc(options=>options.EnableEndpointRouting=false);
//とか
services.AddControllers(options=>options.EnableEndpointRouting=false);
//とか
services.AddControllersWithViews(options=>options.EnableEndpointRouting=false);
//とか
services.AddRazorPages().AddMvcOptions(options=>options.EnableEndpointRouting=false);

HostBuilderでWebHostBuilderを置き換える

2.2ではこうだったが、

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

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

3.0ではこう。

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

この変更で最も大きな変更はDI。 IConfigurationとIHostingEnvironmentのみをStartupのコンストラクタにインジェクトできる。 HostBuilderのDI制限。

DIコンテナは一度だけ実体化される。