あまりにも情報不足なのと、Microsoftからの情報提供が悪過ぎるのにムカついたので書きまくる!
本サイト内関連ページ
概要 †
ASP.NETの歴史 †
- 1996年 : Active Server Pages
- 2002年 : ASP.NET
- 2009年 : ASP.NET MVC
- 2016年 : ASP.NET Core
ASP.NET Core の特徴 †
- オープンソースで開発されている
- 動作環境がWindowsに加えMacとLinuxに正式に対応した
- これまで個別の機能であった「ASP.NET MVC」「WebAPI」「WebPages?」は、ASP.NET Coreで再設計され、1つに統合された
- Linux/Mac/Windows共通で使用できるコマンドラインインターフェース「.NET CLI」が用意された。このコマンドを使用することで、リポジトリから取得してきたソースコードを、環境を意識することなく依存解決を行い、ビルドし、実行できるようになった。
- IIS 非依存。libuvベースのKestrelという新しいWebサーバーが提供され、IISやNginxとの連携することもできる。
- MVC/Entity Framework Core の知識を必須とするため、ASP.NET Web Forms や型付きデータセットで開発されてきた方々には、非常にハードルが高い開発プラットフォームにもなっている
- 高水準 UI 部品が大量に存在していた ASP.NET Web Forms から、いきなりスクラッチ開発に近い ASP.NET MVC/EF 開発ベースに移れと言われても正直キツイ(らしい)
アプリケーションの構成 †
Startupクラス †
- ASP.NET Core アプリケーションには Startup クラスが必要
- Startup クラスのコンストラクタに、dependency injection によってオブジェクトを注入することができる。例えば、
- IHostingEnvironment? を注入して構成ソースを設定
- ILoggerFactory? を注入してlogging プロバイダーを設定
- Startup クラスには Configure メソッドが必須で、オプションで ConfigureServices? メソッドを含めることができる
Configureメソッド(必須) †
- ASP.NET Core アプリケーションが HTTP リクエストにどのように応答するかを指定するために使用される
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseIdentity();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
ConfigureServices?メソッド(オプション) †
- Configure メソッドの前に呼び出される
- 構成オプション はこのメソッドで設定される
- 実質的なセットアップが必要な機能のために、IServiceCollection? には Add[Service] 拡張メソッドが用意される
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvc();
}
Dependency Injection †
- AddMvc? や AddDbContext? などフレームワークが提供している拡張メソッドも、実際は内部で必要なクラスをコンテナに追加しているに過ぎない
- デフォルトの DI コンテナでは 3 種類存在している
- AddSingleton?
- AddScoped?
- AddTransient?
- 使いなれた DI コンテナに切り替えたい場合は、ConfigureServices? メソッドで IServiceProvider? を返すだけで良い?
- 基本的にはコンストラクタへのインジェクションのみ
- IServiceProvider? をコンストラクタで受けとれば、任意のインスタンスを作成できそう
日本語処理 †
文字エンコーダーの設定変更 †
View に
汉语/漢語
のような文字が表示される場合はこの設定変更を検討する。
- ASP.Net Core + Razorで日本語がエスケープされないようにする
- Startup.cs に以下の記述を加える
using System.Text.Encodings.Web;
using System.Text.Unicode;
public void ConfigureServices(IServiceCollection services) {
services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.BasicLatin,
UnicodeRanges.CjkSymbolsandPunctuation,
UnicodeRanges.Hiragana,
UnicodeRanges.Katakana,
UnicodeRanges.CjkUnifiedIdeographs));
// その他 .AddMvc() など...
}
- デフォルトではHtmlEncoder?.Defaultが使われ、これがU+0000..U+007F以外は全てエスケープする設定になっている
- なので、そこでDIにて日本語も許容するように設定