MS_ASPNETModernization - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

ASP.NET の Modernization

抂芁

以䞋を行なうこずで Modernization が可胜ず考える。

  • NuGet 化

  • OWIN化

  • RouteConfig

  • BundleConfig

  • 個別 の Modernization

    • ASP.NET Web Forms の Modernization
    • ASP.NET MVC の Modernization

補足本ペヌゞの䜍眮づけ: ここで蚀う Modernization は
**「.NET Framework 版 ASP.NET のたた、䞭身を今颚にする」**ずいう
段階的な近代化を指す。
ASP.NET Coreぞの移行䜜り盎しずは別の道である。

【遞択肢】
  ① 珟状維持              
 䜕もしない塩挬け
  ② Modernization         ← 本ペヌゞ。ASP.NET のたた近代化
  ③ ASP.NET Core ぞ移行   
 [ASP.NET Coreぞの移行](MS_MigrationToASPNETCore)
  ④ 䜜り盎し              
 党面刷新

② の意矩は、

  • ③ の前段ずしお、䟝存関係を敎理しおおける
    NuGet 化・OWIN 化は、そのたた移行の準備になる
  • ③ に螏み切れない事情工数、芁員、Web Forms 資産がある堎合の珟実解

ずいう点にある。
特に OWIN 化は ASP.NET Core のミドルりェア モデルず同じ考え方であり、
③ ぞの地ならしずしお効果が倧きい。

NuGet 化

NuGet に登録されおいるラむブラリに぀いおは、その取埗方法を NuGet 化する。

NuGet に぀いお

コチラを参照。

NuGet の操䜜手順

コチラを参照。

既存ラむブラリの NuGet 化

既存の参照蚭定しお NuGet から取埗したものを参照するようにする。

  • 参照蚭定を削陀する。
  • PM> Install-Package XXXXX コマンドにより、パッケヌゞをむンストヌルしお参照蚭定を远加する。
  • Git からは、packages フォルダを削陀できる
    ビルド時に packages.config の内容に埓っお埩元されるため。

既存 JS、CSS ファむル等の NuGet 化

既存のファむルを削陀しお NuGet から取埗したものを参照するようにする。

  • 既存のファむルを削陀する。
  • PM> Install-Package XXXXX コマンドにより、パッケヌゞJS、CSS ファむル等を取埗する。
  • JS、CSS ファむルの参照方法を倉曎する埌述のBundleConfigを䜿甚するず良い。
  • Git には Content, fonts, Scripts フォルダを含める。
    • ビルド時に packages.config の内容に埓っお packages フォルダは埩元されるが、
      Script や Content フォルダは埩元されないため。
    • Script や Content フォルダを埩元する堎合、
      Visual Studio のパッケヌゞ・マネヌゞャコン゜ヌルから、Update-Package を行なう。

補足JS/CSS を NuGet で配るのは珟圚は非掚奚: 原文の手順は
packages.config 方匏の content\ フォルダ機胜に䟝存しおいる。
この機胜は、

ずいう 2 ぀の理由で、珟圚は䜿われない。

時期 JS/CSS の取埗方法
本ペヌゞの時代 NuGetInstall-Package jQuery 等
䞭間期 BowerVisual Studio 2015〜。廃止枈み
珟圚 npm / libmanLibrary Manager / CDN

**libmanLibraryManager**は、
Visual Studio 2017 15.8 以降に暙準搭茉された軜量な取埗ツヌルで、
npm ほど倧掛かりにせず、CDN からファむルだけ取っおくる甚途に向く。

// libman.json
{
  "defaultProvider": "cdnjs",
  "libraries": [
    { "library": "[email protected]", "destination": "wwwroot/lib/jquery/" },
    { "library": "[email protected]", "destination": "wwwroot/lib/bootstrap/" }
  ]
}

既存の ASP.NET を近代化する堎合でも、
JS/CSS は NuGet から libman か npm ぞ移す方が、
埌々の ASP.NET Coreぞの移行 が楜になる。

既存ラむブラリや、JS、CSS ファむルの䞀括曎新

以䞋の手順で、ラむブラリや、JS、CSS ファむルを曎新可胜。

  • packages.config を最新のものに曞き換える。

  • 䞀床、packages フォルダ、Content, fonts, Scripts フォルダを削陀する。

  • ゜リュヌションをリビルドするず、

    • packages フォルダが埩元される。
    • Content, fonts, Scripts フォルダは埩元されない。
  • 以䞋のように必芁なパッケヌゞに察しお、Update-Package を行う。
    党おのパッケヌゞに察しお機械的に Update-Package を行っおも良い。

    • Content, fonts, Scripts フォルダを持぀パッケヌゞ
      • Content, fonts, Scripts フォルダを持぀パッケヌゞを特定する。
        埩元した packages フォルダを調べるず、
        Content, fonts, Scripts フォルダを持぀パッケヌゞを特定できる。
      • Content, fonts, Scripts フォルダを持぀パッケヌゞに察しお Update-Package を行う。
    • その他、Update したいパッケヌゞ
      必芁に応じお、その他のパッケヌゞに察しおも、Update-Package を行う。

移行メモ誀蚘: 原文の「パッケヌゞの特定する。」は
**「パッケヌゞを特定する。」**の助詞の誀りず刀断し修正した。

最新のテンプレヌト実装を参考にパッケヌゞをむンストヌル

新しいバヌゞョンでサポヌトされた機胜に必芁なパッケヌゞなどを、
新しいテンプレヌトの packages.config 等から読み取っお、
必芁に応じお、Install-Package によっおパッケヌゞをむンストヌルする。

HttpClientなど、BCL 入りした、ものの差替など。

<package id="Microsoft.Net.Http.ja" version="2.0.20710.0" targetFramework="net46" />
  • ↓に差し替える。
<package id="System.Net.Http" version="4.3.0" targetFramework="net46" />
<package id="System.Net.Http.Formatting.Extension" version="5.2.3.0" targetFramework="net46" />
  • Nuget の堎合、以䞋でむンストヌルできる。
Install-Package System.Net.Http
Install-Package System.Net.Http.Formatting.Extension

補足System.Net.Http は入れない方がよい堎合が倚い: 皮肉なこずに、
この差し替えは別の問題を招きやすい。

net472 以降では System.Net.Http は BCL に含たれるため、
NuGet 版を入れるず
「which has a higher version」 や
MSB3247 の版衝突が起きる。

タヌゲット System.Net.Http の扱い
net45〜net461 NuGet 版が必芁な堎合がある
net472 以降 BCL 版を䜿うNuGet 版は入れない
.NET Core / .NET ランタむムに含たれる垞に䞍芁

近代化の぀いでにタヌゲット フレヌムワヌクを net48 に䞊げ、
System.* の分割パッケヌゞを倖す
のが、珟圚の正しい方向である
.NETバヌゞョンアップ。

OWIN化

補足OWIN 化の戊略的な意味: 数ある近代化項目の䞭で、
OWIN 化が最も埌々効く。

【System.Web に密結合した ASP.NET】
   HttpContext.Current に䟝存 → IIS 前提 → 移行が困難

【OWIN 化した ASP.NET】
   Startup.cs で app.Use(...) を䞊べる
     → ASP.NET Core のミドルりェアず同じ考え方
     → 認蚌Katana の Cookie/OAuth ミドルりェアが
       ASP.NET Core ずほが同じ API になる
     → 移行時にコヌドの倚くが流甚できる

実際、ASP.NET Core のミドルりェア パむプラむンは
OWIN の蚭蚈思想をそのたた発展させたもの
である。

ただし、OWINKatana自䜓は既にメンテナンスされおいないため、
「OWIN 化 → そこで止たる」のではなく
**「OWIN 化を経お ASP.NET Core ぞ」**ずいう道筋で捉えるのが劥圓である。

が察象ずなる。

  • ここでは、以䞋の様なりェブサむトや Web アプリケヌションを䜜成する
    フロント゚ンド Web アプリケヌションフレヌムワヌクのファむル矀を

する。

する。

Bundle & Minification

Bootstrap

  • HTML 及び CSS ベヌスのデザむンテンプレヌトずしお甚意されおいる。

    • タむポグラフィ
    • フォヌム
    • ボタン
    • ナビゲヌション
    • その他構成芁玠
    • JavaScript 甚拡匵
    • , etc.
  • むンストヌル方法

Install-Package Bootstrap 

jQuery

  • jQuery
    • りェブブラりザ甚の JavaScript コヌドをより容易に蚘述
      できるようにするために蚭蚈された軜量な JavaScript ラむブラリ
    • むンストヌル方法
Install-Package jQuery
  • jQuery UI
    Bootstrap ず競合する。Bootstrap を優先する堎合、むンストヌルしない。
    • むンタラクティブな Web サむトを開発するために䜿甚される、
      jQuery をベヌスにした JavaScript のラむブラリ
    • むンストヌル方法
Install-Package jQuery.UI.Combined

modernizr

ブラりザの機胜サポヌト状況をチェックし、
HTML タグにサポヌト状況を刀別できるクラスを付䞎、
結果を蚘録した modernizr グロヌバルオブゞェクトを生成する。

  • むンストヌル方法
Install-Package Modernizr

Respond.js

IE8 以䞋でレスポンシブ Web デザむンを実珟する。

  • むンストヌル方法
Install-Package Respond

補足この節のラむブラリ遞定は芋盎しが芁る最新化: 本節は
IE8 が珟圹だった時代の構成である。珟圚の状況を補っおおく。

ラむブラリ 珟況
Bootstrap 珟圹5.x。ただし jQuery 䟝存を廃止Bootstrap 5
jQuery 珟圹3.xだが、新芏では䞍芁なこずが倚い
jQuery UI 開発終了2021 に最終版。非掚奚
modernizr 圹目を終えた察象ブラりザが機胜を党郚持っおいる
Respond.js 䞍芁IE8 察応のため。IE 自䜓がサポヌト終了

IE は 2022 幎 6 月にサポヌト終了しおおり、
Respond.js / modernizr を近代化の名目で導入する意味は無い。
むしろ倖すのが近代化である。

たた、Bundle & MinificationSystem.Web.Optimization自䜓も、
フロント゚ンドのビルド ツヌルVite / webpack / esbuildに
眮き換わっおいる。

時期 手段
本ペヌゞの時代 System.Web.OptimizationBundleConfig.cs
ASP.NET Core 初期 BundlerMinifierbundleconfig.json廃止枈み
珟圚 npm ベヌスのバンドラヌVite / esbuild or CDN

ASP.NET Core には asp-append-versionキャッシュ バスティングや
<environment> タグ ヘルパヌ開発/本番の切り替えが甚意されおおり、
「バンドルはフロント偎のツヌルに任せ、
配信ずバヌゞョニングだけ ASP.NET Core が面倒を芋る」
ずいう分担になっおいる。

CDNフォヌルバック

機胜抂芁

  • 著名なフロント゚ンド Web アプリケヌションフレヌムワヌクのファむル矀は
    CDN から配垃されおいる。
  • これらのファむル矀を Bundle & Minification する堎合、
    同時に、CDN フォヌルバックの蚭定をするこずができる。

蚭定の仕方

  • ScriptBundle、たたは StyleBundle コンストラクタヌの第 2 匕数に、
    CDNの URL を远加
  • CdnFallbackExpression プロパティに、
    ラむブラリがロヌドできたかどうかを刀定するための匏を指定する。

蚭定の䟋

  • ScriptBundle の堎合
ScriptBundle jquery = new ScriptBundle(
                     "~/bundles/jquery",
                     "http://ajax.aspnetcdnn.com/ajax/jQuery/jquery-2.0.0.min.js")
                         .Include("~/Scripts/jquery-{version}.js");
jquery.CdnFallbackExpression = "window.jQuery";
bundles.Add(jquery);
  • StyleBundle の堎合
    むンタヌフェむス䞊は ScriptBundle ず同じように蚭定可胜だが、
    珟バヌゞョンでは蚭定䞍可胜なもよう。

  • 参考

補足CDN 利甚は珟圚は慎重に: 公開 CDN から
ラむブラリを読み蟌む構成は、珟圚は掚奚されないこずが倚い。

理由 内容
キャッシュ共有の効果が消えた ブラりザがオリゞンごずにキャッシュを分離2020 頃〜
サプラむ チェヌン リスク CDN が改竄されるず党利甚者に圱響
可甚性 CDN 障害・遮断瀟内網、特定囜で壊れる
プラむバシヌ 第䞉者に IP・Referer が枡る

「他サむトで既にキャッシュ枈みだから速い」ずいうか぀おの最倧の利点は、
ブラりザ偎の仕様倉曎で倱われおいる
。

CDN を䜿う堎合は SRISubresource Integrityを必ず付ける。

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"
        integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo="
        crossorigin="anonymous"></script>

ASP.NET Core では asp-fallback-* タグ ヘルパヌが
本節のフォヌルバックに盞圓する機胜を提䟛する。

<script src="https://cdn.../jquery.min.js"
        asp-fallback-src="~/lib/jquery/jquery.min.js"
        asp-fallback-test="window.jQuery"
        integrity="sha256-..." crossorigin="anonymous"></script>

原文の「StyleBundle では蚭定䞍可胜」ずいう芳枬に぀いおは、
ASP.NET Core のタグ ヘルパヌでは
asp-fallback-test-class / -property / -value により
CSS でもフォヌルバック刀定ができるようになっおいる。

リンクのさせ方

ヘッダでリンク

  • CSS ファむルはヘッダでリンクする。
  • JS ファむルもヘッダでリンクする。
    • modernizr など、初期凊理に必芁なもの。
    • ・・・

フッタでリンク

それ以倖の JS ファむルはフッタでリンクする。

補足珟圚は defer を䜿う: 「フッタに眮く」ずいう手法は、
defer 属性で眮き換えられる。

<!-- head に眮いおも、HTML 解析をブロックせず、解析完了埌に順番通り実行される -->
<script src="app.js" defer></script>

<!-- 順序を問わない独立したスクリプトなら async -->
<script src="analytics.js" async></script>
手法 特城
フッタに配眮 叀兞的。HTML の構造ずスクリプトの䜍眮が離れる
defer head に曞ける。順序が保蚌される掚奚
async ダりンロヌド完了順に実行順序䞍定
type="module" 既定で defer 盞圓

defer を䜿えば head にたずめお曞けるため、
「どこに眮くか」を意識する必芁がなくなる。

個別 の Modernization

以䞋を参照。

その他

Web サヌビス開発ぞ察応するASP.NET Core

Visual Studio、ASP.NET特に Web Formsは、
゚ンタヌプラむズ向けであったこずもあり、
Web サヌビス隆盛の時代の流れに乗り遅れた感はある。

Web サヌビス

このため、珟圚は、Web サヌビスの分野に適合したフレヌムワヌクをリリヌスしおいる。

Linux プラットフォヌム

たた、Web サヌビスの分野で倚甚される Linux プラットフォヌム䞊で
動䜜する OSS のランタむムの提䟛を開始しおいる。

補足この節の芋立おの、その埌: 原文の分析
゚ンタヌプラむズ寄りで Web サヌビスの流れに乗り遅れたは
劥圓な敎理である。その埌の展開を補っおおく。

【原文の時点】
   ASP.NET MVC / Web Pages で远い぀こうずしおいる段階

【珟圚】
   ・ASP.NET Core が Linux / コンテナで䞀玚垂民に
   ・TechEmpower 等のベンチマヌクで最䞊䜍矀の性胜
   ・最小 API / gRPC / SignalR で「Web サヌビス」甚途を網矅
   ・Web Pages は事実䞊終息Razor Pages が埌継的䜍眮づけ

䞀方で、Web Forms には埌継が甚意されなかった
.NET 6ぞの移行。
Web Forms 資産を抱える堎合、

  • ② Modernization で延呜する本ペヌゞ
  • Blazor ぞ䜜り盎すコンポヌネント指向で発想が近い
  • Razor Pages / MVC ぞ䜜り盎す

のいずれかを遞ぶこずになる。

参考

Bundle & Minification

CDNフォヌルバック

Microsoft Learn


Tags: 移行, .NET開発, ASP.NET, ASP.NET Web Forms, OWIN, NuGet

⚠ **GitHub.com Fallback** ⚠