-
Notifications
You must be signed in to change notification settings - Fork 0
MS_MigrationToASPNETCore
- 戻る(.NET Core > ASP.NET Core、移行・マイグレーション > 各種、技術毎の移行性 > .NETのクロスプラットフォーム対応)
- ASP.NET Coreへの移行
- .NET Standardへの移行
- .NET Coreへの移行
※ 対象は、ASP.NET Core 2.0。
-
「ASP.NET Core」のMVC6や
WebAPIへの移行ノウハウをサマリする。 -
下記と異なり、新規作成したテンプレートに、
UOC(User Own Coding)部分を移行する形になるため
コンバージョン手順は書かない。 -
従って、ココでは、ひたすら、ASP.NET と
ASP.NET Coreの差異について書いて行く。- ざっくり、B / D 層以外の、以下のような P 層の変更が多い。
- 脱
System.Webによる API 変更 - 新しい DI による構成方法の変更
- 要求処理パイプラインの変更
- 認証周りの API の変更
- , etc.
- 脱
- また、ASP.NET Coreのフレームワークは
MVC6とRazor Pagesで、
主流が、MVC6になる。
- ざっくり、B / D 層以外の、以下のような P 層の変更が多い。
移行メモ(本ページの前提年代): 本ページは
ASP.NET Core 2.0(2017年)時点の記述である。
骨格(脱System.Web/ DI / パイプライン / 認証 API)は
現在も変わらないが、周辺のツール(bower / Grunt 等)は
大きく入れ替わっている。各節に補足を付す。
以下に合致するケースに適合する。
-
Linux がサポートする、nginx(
DNET_nginx.md) +
Docker(DNET_Docker.md)などのクロスプラットフォームで、
ハイパフォーマンスを実現するマイクロサービスなどの
新しいアーキテクチャに対応させたい場合。 -
そのような中で、昔から使っている C# / VB などの言語、
Visual Studioの開発環境を使用したい。
しかし、現在は IoT、クラウド、次世代のモバイルソリューションなど、
多くのシナリオの基礎になっているらしく、
既定で、ASP.NET Core を選択しても良いかもしれない。
補足(現在の判断は単純である): 執筆時は「選定基準」を検討する
余地があったが、現在は次のとおり選択肢が実質 1 つになっている。
現状 ASP.NET(.NET Framework) 新機能なし。.NET Framework 4.8 と共に据え置き ASP.NET Core 新規開発はすべてこちら 検討すべきは「移行するか否か」ではなく、
「いつ・どの範囲を移行するか」である。
- クラス・ライブラリ等の移行について、以下を確認しておく。
補足(移行の定石): 実務での順序は次のとおり。
下(ライブラリ)から上(UI)へ進めるのが鉄則である。
- クラス ライブラリを
netstandard2.0にする
→ .NET Framework 側からも参照でき、両方から使える状態になる。- プロジェクト形式を SDK スタイルに変換する(
try-convert)。- UI(P 層)を新規テンプレートに載せ替える
→ ここは本ページの言うとおり、書き直しになる。- 最後にライブラリを
net8.0に上げ、.NET Framework 依存を切る。1 と 2 は既存アプリを動かしたまま進められるため、
リスクを小さく刻める。
参照設定を行う。
- パッケージ・マネージャ
- NuGet
- bower
- npm
- LibMan
- SDK(アセンブリ参照 / プロジェクト参照)
- アナライザー
- 起動設定、構成管理ツール(
MS_ConfigurationManagementTools.md)には登録されない。 - Visual Studio の[デバッグ]タブには、ファイル編集の GUI がある。
- 複数の起動設定を Command Line で切り替えることができる。
静的コンテンツを配置する。
| フォルダ | 内容 |
|---|---|
Controllers |
MVC6の *.cs or *.vb
|
Models |
MVC6の *.cs or *.vb
|
Views |
MVC6の *.cshtml or *.vbhtml
|
Pages |
Razor Pagesの *.cshtml or *.vbhtml
|
Web アプリケーションのエントリポイント
-
経緯
- .NET Framework のASP.NETでは、
-
OWINにより
Startupがサポートされたが、
Global.asaxは生きていたので併用も可能だった。
-
OWINにより
- これに対してASP.NET Coreでは、
-
Startupは、OWINに依存せず、Program.csのMain経由で
読み込まれる。 - このため、完全に、
Global.asaxからStartupに移行する必要がある。
-
- .NET Framework のASP.NETでは、
-
処理
ミドルウェア / サービス / フレームワークをStartupクラスのメソッドで
注入することにより、活用できるようになる。- 必要に応じて、
ConfigureServicesメソッドでミドルウェア / サービス /
フレームワークを注入する。 -
Configureメソッドでアプリケーション、ミドルウェア / サービス /
フレームワークの要求処理パイプラインを構成する。
- 必要に応じて、
補足(最新化:Startup.cs は無くなった): .NET 6 以降の
テンプレートは Minimal Hosting になり、
Startup.csが廃されProgram.cs1 本に集約された。var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllersWithViews(); // 旧 ConfigureServices var app = builder.Build(); app.UseStaticFiles(); // 旧 Configure app.MapDefaultControllerRoute(); app.Run();従来の
Startup.cs方式も引き続き動作するため、
移行時に慌てて書き換える必要はない。
ただし新しいドキュメント・サンプルはすべて上記の形なので、
読み替えができる必要はある。
- .NET Core configを参照。
- 詳細は.NET configも参照。
-
BundleConfig.csからbundleconfig.jsonに変更されている。 - bundling and minification の結果は、
wwwrootに保存される。 - CDN フォールバックは
ScriptTagHelperのasp-fallback系属性で実装できる。
-
package.json(npm) -
bower.json、.bowerrc(bower) -
libman.json(LibMan)
- 言わずと知れた NuGet。
- 現在は、ASP.NET Coreの既定のパッケージ・マネージャになっている。
- ブラウザで使用する CSS/JavaScript ライブラリはコチラから取得する。
- Visual Studioとは、わりと上手く統合されているもよう。
- テンプレートから angular や react を選択すると NuGet に加え、
npm が使える状態で初期化される。 - パッケージ・マネージャの機能の範囲に限定すれば、
Visual Studioと、上手く統合されているもよう。
- 軽量なクライアント側ライブラリ取得ツール
-
wwwroot/libの復元のために利用できる。
補足(最新化:bower は廃止された): bower は 2017年に非推奨となり、
現在は使われていない。
ASP.NET Coreのテンプレートからも削除済みである。現在のクライアント側資産の管理は次のいずれかになる。
手段 向く場面 LibMan jQuery / Bootstrap を数個置くだけ。ビルド不要 npm + バンドラ(Vite / webpack) SPA・TypeScript を含む本格的なフロント CDN 参照 最も軽い。オフライン要件が無い場合 元ページが「Open棟梁テンプレートでは bower を廃止し npm に一本化した」と
書いているのは、この流れを先取りした妥当な判断であった。
-
BundlerMinifier.Coreなどが標準でサポートされている他、 -
Gulp と Grunt のタスク ランナーがサポートされている。
-
npm も、
package.jsonで、タスク・ランナー的に使える。- ただし、タスク・ランナーの機能の範囲では、
Visual Studioと、あまり上手く統合されていない。
- ただし、タスク・ランナーの機能の範囲では、
補足(最新化): Grunt / Gulp / BundlerMinifier はいずれも
現在ほぼ使われていない。
BundlerMinifierは 2023年にアーカイブされた。現在は npm scripts + Vite(あるいは webpack / esbuild)で
ビルドし、成果物をwwwrootに出力する構成が標準である。
Visual Studio側も
SpaProxy/npm run buildの呼び出しで統合できる。
ASPNETCORE_ENVIRONMENT 環境変数を使用して複数の構成を初期化できる。
- 環境名:
Development/Staging/Production - 対象
-
launchSettings.jsonの設定 -
Startupクラス内での各種設定 -
EnvironmentTagHelperの利用
-
- ASP.NET Core における DI(
MS_ASPNETCoreDI.md) - ミドルウェアのインジェクション
-
System/System.Web/Microsoft.Owin/ NuGet ライブラリの差異は
.NET Standardへの移行を参照。
| 旧 | 新 |
|---|---|
Request.IsAuthenticated が無い |
User.Identity.IsAuthenticated に置き換える |
HttpNotFound / HttpStatusCodeResult が無い |
NotFound / StatusCode メソッドを利用する |
OutputCache が無い |
ResponseCache を使うか、データキャッシュに実装しなおす |
補足(よく詰まる非互換の追加): 上記以外で移行時に頻出するものを挙げる。
.NET Framework 版 ASP.NET Core HttpContext.Current廃止。DI で IHttpContextAccessorを注入Server.MapPath()IWebHostEnvironment.ContentRootPath/WebRootPathConfigurationManager.AppSettingsIConfiguration(.NET configを参照)System.Web.HttpUtilitySystem.Net.WebUtility/Microsoft.AspNetCore.WebUtilitiesSession["key"](任意のオブジェクト)HttpContext.Session(byte[] / string / int のみ。複雑な型は自前でシリアライズ)Global.asaxのApplication_Error例外処理ミドルウェア( UseExceptionHandler)HTTP モジュール / ハンドラ ミドルウェア
HttpContext.Currentに依存した静的ヘルパーが
ライブラリ層に潜り込んでいると移行コストが跳ね上がる。
事前に洗い出しておきたい最重要ポイントである。
サービス、フレームワークなどと呼ばれることもある。
- API が異なるもよう。
- 以下に依存している場合、広範囲に修正が必要になる。
- ASP.NET Forms認証
-
ASP.NET Identity
→ ASP.NET Core Identityのマイグレーションを参照。
- 詳細はASP.NET Core における 認証を参照。
非互換がある模様。
-
FindAsyncメソッドが無い。 -
SqlQueryメソッドが無い。
移行メモ(最新化): 上記は EF Core 1.x 時点の話で、現在は解消している。
元ページ 現在 FindAsyncが無いEF Core 1.1 以降で実装済み SqlQueryが無いFromSqlRaw/FromSqlInterpolated、EF Core 7 以降はSqlQuery<T>一方で、EF Core にはLazy Loading の既定無効、
クライアント評価の禁止(EF Core 3.0 以降)など、
EF6 とは挙動が異なる点が残る。
特に後者は「EF6 では動いていた LINQ が実行時例外になる」
という形で表面化するため、移行時の要注意点である。
開発者例外ページが非常に良くなっているようなのでこれを使わない手はない。
以下の例外画面を構成できる。
- 開発者例外ページ(
UseDeveloperExceptionPage) - カスタム例外処理ページ(
UseExceptionHandler) - ステータス コード ページ(
UseStatusCodePages)
補足: 開発者例外ページは本番で有効にしてはならない
(スタック トレース・環境変数・接続文字列が露出する)。
テンプレートではif (app.Environment.IsDevelopment())で
囲われているので、これを外さないこと。
- ASP.NET CoreとASP.NET 4.6 は別物
-
ASP.NET CoreにASP.NET Web Formsは無いので、
- ASP.NET Web Formsからの移行は不可能。
-
ASP.NET MVC(MVC5)からASP.NET Core MVC
(MVC6)への移行パスを検討する。
補足(Web Forms からの移行の現実解): 「移行は不可能」は
自動変換という意味では今も正しい。
実務での選択肢は次の 3 つになる。
方針 内容 Blazor へ コンポーネント + イベント ドリブンで発想が最も近い。Microsoft も移行先として案内 ASP.NET Core MVC / Razor Pages へ 画面単位で素直なのは Razor Pages(1 画面 1 ファイル = Web Forms に近い) 据え置く .NET Framework 4.8 のまま維持。Windows のサポートが続く限り動く 「1 画面 1 Form」という Web Forms の構造は、
MVC よりも Razor Pages に対応させる方が自然である点は
見落とされやすい。
旧資産に縛られている場合はなかなか移行できないと思う。
-
例えば、SaaS 開発の方で ChartControl などを使っているが、
ASP.NET Coreではソコまでの機能拡充がされる気配が
今の所無いと思う。 -
Linux も必須の要件ではないし、ビジネス・アプリケーションの、
Dynamics CRM(MS_Dynamics.md)では
Web Forms (ASPX)が現役だったりする。と、個人的には(現段階では、まだ、)結構微妙と考えている。
旧資産から解放された場合は、思い切ったシフトができると思う。
-
ASP.NET Core(1.0)は、不安定で変更が多い。
-
例えば、細かい話、ASP.NET Identity の
PasswordHasherの実装が違う。
既存データでウワモノ移行などでは、更に難易度が上がる気配も...。 -
このように、2017年12月 現在、ASP.NET Coreは、
まだ安定しているとはいえないが、- 2017年8月、ASP.NET Core 2.0 が公開され、
- ASP.NET MVC(MVC5)が、2015年2月以降、更新されていないので、
今後、メインストリーム、新技術サポートが、
MVC6に移っていく可能性がある。
補足(答え合わせ): 「メインストリームが MVC6 に移る」という予想は
完全に的中した。
また「不安定で変更が多い」という当時の懸念も、
.NET 6 以降は LTS 中心の年次リリースに落ち着き、解消している。
PasswordHasherの非互換については、
ASP.NET Core Identity側に
互換モード(PasswordHasherCompatibilityMode.IdentityV2)が
用意されており、既存のハッシュを検証しつつ
ログイン時に新形式へ段階的に移行できる。
移行時に泣かずに済む数少ない親切な仕組みである。
ASP.NET Coreのプロジェクト・テンプレートに、
- ASP.NET Core Web Application (.NET Core)
- ASP.NET Core Web Application (.NET Framework)
があったが、ASP.NET Core 2.0 時点から
サポートプラットフォームは .NET Core のみに絞られた。
移行メモ(正確な時期): 「2.0 時点で絞られた」は少し早い。
実際には ASP.NET Core 2.0 では両方サポートされ、
ASP.NET Core 3.0(2019年)で .NET Framework のサポートが終了した。
ただし「.NET Framework を切る」という方針表明自体は
2.0 の頃に行われており、本ページの認識はその文脈である。
-
ASP.NET Core への移行 | Microsoft Learn
https://learn.microsoft.com/aspnet/core/migration/- ASP.NET から ASP.NET Core への移行
https://learn.microsoft.com/aspnet/core/migration/proper-to-2x/ - HTTP モジュールからミドルウェアへ
https://learn.microsoft.com/aspnet/core/migration/http-modules
- ASP.NET から ASP.NET Core への移行
-
.NET Upgrade Assistant
https://learn.microsoft.com/dotnet/core/porting/upgrade-assistant-overview -
ASP.NET Core でのホスティング / Kestrel Web サーバー
https://learn.microsoft.com/aspnet/core/fundamentals/servers/kestrel
-
.NET が Linux 上でも動作する。.NET Core 移行と Open棟梁の .NET Core 対応情報
https://www.osscons.jp/jovxsnjzb-537/ -
.NET Core2.0 移行の移行性に関する報告
https://www.osscons.jp/jofbwaon0-537/ -
ASP.NET Core の Linux 開発環境についての考察(WSL or Docker)
https://www.osscons.jp/jotmuz8dq-537/ -
Open棟梁 @ ASP.NET Core を Docker で動作確認しました。
https://www.osscons.jp/joerypz9u-537/
-
しばやん雑記
- 既存の ASP.NET Web API アプリケーションを ASP.NET Core MVC 1.0 へマイグレーションしてみた
http://blog.shibayan.jp/entry/20160628/1467113657
- 既存の ASP.NET Web API アプリケーションを ASP.NET Core MVC 1.0 へマイグレーションしてみた
-
clock-up-blog
- ASP.NET MVC と ASP.NET Core MVC の名前と機能と採用判断の話など
http://blog.clock-up.jp/entry/2017/07/26/aspnet-core-mvc-start
- ASP.NET MVC と ASP.NET Core MVC の名前と機能と採用判断の話など
Tags: 移行, .NET開発, .NET Core, ASP.NET, ASP.NET MVC
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。