ASP.NET CoreはVisualStudioでWebページおよびWebサーバー開発のためのフレームワークの1つである。Windows標準のWebサーバーであるIISとHTTP接続することができ、開発用ではIIS ExpressとHTTP接続できる。Application CodeのサーバーとしてはKestrel(ASP.NET用のWebサーバ)が担当し、HttpContext接続を行う。Kestrelから直接ブラウザからアクセスすることができる。
このページでは、おもにC#コードの部分と設定、環境について解説する。主にマイクロソフトASP.NET Coreドキュメントを参照し作成している。「Webアプリケーション」テンプレート ASP.NET Core 3.1を使用する。IIS Expressで実行すると以下のようなページが表示される。
ASP.NET Core 3.0から汎用ホストを使用できるようになり、これが推奨されるようになっている。Mainメソッド記述があるProgram.csを確認する。Program.csを次に示す。
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>(); }); }9行目の「Host」の部分が汎用ホストであることを示している。続く「Configure~」のところでWebホストであることを指定している。
ASP.NET Core 2.2 テンプレートの WebHostBuilderを使用する場合は以下のようになる。
public class Program{ public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>();}「Configure~」が無いことに注目しよう。また、「Host」の代わりに「WebHost」となっていることから、Web専用であることが分かる。WebHostは下位互換のために残されている。
コードの書き方としては、拡張メソッドが多用されている。拡張メソッドとは int.Parse("3") を "3".Parse()と書けるようにするような機能である。また、CreateWebHostBuilderが分離されているが、公式ドキュメントによれば、このように記述する必要がある。
CreateDefaultBuilderメソッドはHostBuilderをインスタンス化し初期化する。主に以下の処理を実行する。
StartupはStartup.csに記述されている。
BuildメソッドはHostBuilderからHostを作成する。
RunメソッドはWeb アプリを起動し、ホストがシャットダウンするまで呼び出し元のスレッドをブロックする。
続いて、プロジェクトの構成を見てみよう。フォルダ構成とともに示す。
[Properties]の[launchSettings.json]はIPアドレス(ホスト名)、TCPポート、SSLなどのエンドポイントの設定が記述される。プロジェクト作成時、[HTTPS 用の構成]にチェックする項目があるが、チェックがあれば「sslPort」が0以外の値になり、単独起動( "profiles"内のプロジェクト名のところ)の[applicationUrl]に「https://localhost:5001」が追加される。
また、発行(IISなど実稼働のための配置)時、PublishProfilesフォルダが作成され、そのなかに「CustomProfile.pubxml」ファイルなどが追加される。
[wwwroot]はWebサーバーにおける静的ファイルのがあるフォルダ名である。これらのファイルが直接クライアントへ提供される。テンプレートではcssフォルダにcssファイルというように格納されている。アイコンファイルであるfavicon.icoも置かれている。HostBuilderの既定値により"wwwroot"が設定されており、環境変数ではASPNETCORE_WEBROOTで設定され。UseWebRoot 拡張メソッドで変更可能であり、「.CreateDefaultBuilder(args).UseWebRoot("public")」とすれば"public"フォルダに変更になる。
[Pages]はWebサーバーにおけるRazor ページとアンダースコア(_)で始まるサポート ファイルが格納されるフォルダ名である。
[appsettings.json]には構成に関する設定が保存されているファイルである。「Development」と書かれているファイルがあるが、フォルダにあるため、ファイル名によりプロジェクトで下位に配置されるようである。
[Program.cs]はMainメソッドがあるファイルである。ホストに関する設定が行われるコードを記述する。IPアドレスなどをオーバーライドすることでエンドポイント設定ができる。Web通信の接続に関する設定である。
[Startup.cs]は構成に関する設定が行われるコードを記述する。ログやRazor使用、静的コンテンツ使用などの設定が行われる。Program.csの設定と比べるとよりサーバー内部の設定である。
公式ドキュメントではプロジェクトファイルを確認するを参照しよう。
Startupクラスは各ページについて全般的な設定を行う。コメントと一部空行を消したテンプレートを示す。
using Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Hosting;namespace RazorPagesMovie{ public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); } }}ConfigureServicesメソッドにはSQLサーバーへの接続を記述することができる。マイクロソフトのチュートリアルでは以下のようなコードになっている。
services.AddDbContext<RazorPagesMovieContext>(options => options.UseSqlServer(Configuration.GetConnectionString("RazorPagesMovieContext")));参照のため「using Microsoft.EntityFrameworkCore;」などを記述する。また、AddRazorPages()はデフォルトでPagesフォルダをルートディレクトリに設定されるが、services.AddRazorPages(rpo => { rpo.RootDirectory = "/Pages1"; });のように記述することで、ルートディレクトリを変更することができる。
Configureメソッドでは通貨記号のためのカルチャーを設定することができる。マイクロソフトのチュートリアルで通貨表示を変える場合に利用できる。イシューにあったコードを参考にしたものである。
var defaultCulture = new CultureInfo("en-US");
var localizationOptions = new RequestLocalizationOptions { DefaultRequestCulture = new RequestCulture(defaultCulture), SupportedCultures = new List<CultureInfo> { defaultCulture }, SupportedUICultures = new List<CultureInfo> { defaultCulture } }; app.UseRequestLocalization(localizationOptions);System.GlobalizationとMicrosoft.AspNetCore.Localizationの参照が必要である。