ASP.NET Core 2.2→3.0への移行 メモ
(2019.10.08)5月にメモとして書いたときと比べ,現時点では.NET Coreが3.0がリリースされており,下のリンクの公式サイトの解説も充実していると思うのでご注意ください.
ASP.NET Core 3.0では2.2と比べていろいろと書き方が変わっている。 なので、ASP.NETの参考書や公式チュートリアルを読むときに適宜変更する必要がある。
ライブラリが統合
↓内に統合
- Microsoft.AspNetCore.App
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ミドルウェアが必須になった。
UseAuthentcation
をUseAuthorization
の直前におくこと。
Core 3.0以降は、UseAuthorization
はStartup.Configure
で呼ばれる。
例えば、以下のHomeControllerはサインインを要求する。
public class HomeController : ControllerBase { [Authorize] public IActionResult BuyWidgets() { ... } }
ASP.NET Core 3.0でUseMvc
やUseMvcWithDefaultRoute
を使いたい場合は、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コンテナは一度だけ実体化される。