「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -戻る --[[.NET Core]] ---[[ASP.NET Core]] --[[移行・マイグレーション]] ---[[.NETのクロスプラットフォーム対応]] * 目次 [#u686b37f] #contents *概要 [#fe38f2a4] ※ 対象は、[[ASP.NET Core]] 2.0。 -「[[ASP.NET Core]]」の[[MVC6>ASP.NET Core MVC]]やWebAPIへの移行ノウハウをサマリする。 -下記と異なり、新規作成したテンプレートに、~ UOC(User Own Coding)部分を移行する形になるためコンバージョン手順は書かない。 --[[.NET Coreへの移行]] --[[.NET Standardへの移行]] -従って、ココでは、ひたすら、[[ASP.NET]] と [[ASP.NET Core]]の差異について書いて行く。 --ざっくり、B / D層以外の、以下のような P 層の変更が多い。 ---脱 System.Web による API 変更 ---新しい DI による構成方法の変更 ---要求処理パイプラインの変更 ---認証周りの API の変更 ---, etc. --また、[[ASP.NET Core]]のフレームワークは[[MVC6>ASP.NET Core MVC]]と[[Razor Pages>ASP.NET Web Pages]]で、主流が、[[MVC6>ASP.NET Core MVC]]になる。~ なお、[[MVC5>ASP.NET MVC]]と[[MVC6>ASP.NET Core MVC]]との差異については[[ASP.NET Core MVC]]にまとめてある。 *選定基準 [#ab7cfef1] **概要 [#w70488ec] 以下に合致するケースに適合する。 -Linuxがサポートする、[[nginx>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?nginx]] + [[Docker>Docker for Windows]]などのクロスプラット フォームで、~ ハイパフォーマンスを実現するマイクロサービスなどの新しいアーキテクチャに対応させたい場合。 -そのような中で、昔から使っている C# / VB などの言語、[[Visual Studio]]の開発環境を使用したい。 **参考 [#o69fa085] -Microsoft Docs --ASP.NET と ASP.NET Core の選択~ https://docs.microsoft.com/ja-jp/aspnet/core/choose-aspnet-framework --サーバー アプリ用 .NET Core と .NET Framework の選択~ https://docs.microsoft.com/ja-jp/dotnet/standard/choosing-core-framework-server --Docker コンテナー用 .NET Core と .NET Framework の選択~ https://docs.microsoft.com/ja-jp/dotnet/standard/microservices-architecture/net-core-net-framework-containers/ *事前準備 [#k0d0b14d] -クラス・ライブラリ等の移行について、以下を確認しておく。 -[[クラス・メソッドの検索システムには、ASP.NET Coreのカテゴリ>#j6b71fa5]]を指定する。 **[[.NET Standardへの移行]] [#c97b888a] **[[.NET Coreへの移行]] [#xd12992f] *フォルダ構成 [#xffddb5a] **Properties [#c4be3fe1] ***launchSettings.json [#n27e559b] -起動設定、[[構成管理ツール]]には登録されない。 -Visual Studio の [デバッグ] タブには、ファイル編集の GUI がある。 -[[複数の起動設定>#zf8dc3f4]]をCommand Lineで切り替えることができる。 **wwwroot [#f4fa1549] 静的コンテンツを配置する。 -jquery - Add JavaScript Reference in asp.net core - Stack Overflow~ https://stackoverflow.com/questions/42341203/add-javascript-reference-in-asp-net-core **依存関係 [#i77f9b14] 参照設定を行う。 -[[NuGet>#f51240e8]] -SDK --アセンブリ参照 --プロジェクト参照 -アナライザー **その他のフォルダ [#fe60ea72] ***Controllers [#z5d4b3a1] [[MVC6>ASP.NET Core MVC]]の *.cs or *.vb ファイルが格納される。 ***Models [#l10f908a] [[MVC6>ASP.NET Core MVC]]の *.cs or *.vb ファイルが格納される。 ***Views [#kbfcc82f] [[MVC6>ASP.NET Core MVC]]の *.cshtml or *.vbhtml ファイルが格納される。 ***Pages [#j4bcb793] [[Razor Pages>ASP.NET Web Pages]]の *.cshtml or *.vbhtml ファイルが格納される。 **その他のファイル [#aee84a74] ***Program [#e29db89b] Webアプリケーションのエントリポイント ***Startup [#g42f0f08] -経緯 --.NET Frameworkの[[ASP.NET]]では、 ---[[OWIN]]によりStartupがサポートされたが、Global.asaxは生きていたので併用も可能だった。 ---例:https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Samples/WebApp_sample/MVC_Sample/MVC_Sample/Startup.cs~ https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Samples/WS_sample/ASPNETWebService/ASPNETWebService/Startup.cs --これに対して[[ASP.NET Core]]では、 ---Startupは、[[OWIN]]に依存せず、Program.cs の Main経由で読み込まれる。 ---このため、完全に、Global.asaxからStartupに移行する必要がある。 ---例:https://github.com/OpenTouryoProject/OpenTouryo/blob/SupportNetStandard2%26NetCore2/root/programs/C%23/Samples4NetCore/Backend/MVC_Sample/MVC_Sample/Startup.cs~ https://github.com/OpenTouryoProject/OpenTouryo/blob/SupportNetStandard2%26NetCore2/root/programs/C%23/Samples4NetCore/Backend/ASPNETWebService/ASPNETWebService/Startup.cs -処理~ [[ミドルウェア /サービス / フレームワーク>#b38227ce]]をStartupクラスのメソッドで[[注入>#l75d198a]]することにより、活用できるようになる。 --必要に応じて、ConfigureServicesメソッドで[[ミドルウェア /サービス / フレームワーク>#b38227ce]]を[[注入>#l75d198a]]する。 --Configureメソッドでアプリケーション、[[ミドルウェア /サービス / フレームワーク>#b38227ce]]の要求処理パイプラインを構成する。 -参考 --ASP.NET Core でのアプリケーションのスタートアップ~ https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/startup ***appsettings.json [#ae068f77] -概要 --app.configのappSettings SectionをJSON化したもの。 --環境毎に設定を切り替えることができる。 ---appsettings.Production.json~ ASPNETCORE_ENVIRONMENT ≠ Development ---appSettings.Development.json~ ASPNETCORE_ENVIRONMENT = Development -参考 --[[.NET Standardへの移行 > System系ライブラリ > *.config>.NET Standardへの移行#n8baa2a2]] --Visual Studio 2017 による ASP.NET Core MVC 開発 - Qiita~ https://qiita.com/hiromasa-masuda/items/5b9ff175aac3d1ef6ca6 --ASP.NET Core MVC における構成ファイル appsettings.json からの値取得 - Qiita~ https://qiita.com/hiromasa-masuda/items/d7e33b20d3eedee771f4 --ASP.NET Coreの環境を切り替える方法 - athome-developer’s blog~ http://dblog.athome.co.jp/entry/2016/08/03/113000 ***bundleconfig.json [#q4e3ad8b] -概要 --BundleConfig.csからbundleconfig.jsonに変更されている。 --自動化する場合は、[[npm>#e4af8da1]]経由でBundlerMinifier.Coreを実行す。 --なお、[[CDNフォールバック>ASP.NET MVC の Modernization#s8ee8670]]は、[[ScriptTagHelper>ASP.NET Core MVC#k7a9156e]] > asp-fallback系属性で実装できる。 -参考 --ASP.NET Core でのバンドルと minifiy の静的な資産 | Microsoft Docs~ https://docs.microsoft.com/ja-jp/aspnet/core/client-side/bundling-and-minification ***bower.json [#dc01cb8e] [[bower>#q464638b]]におけるpackage.config的なファイル。 *パッケージ・マネージャ [#w4347dc8] **[[NuGet>.NET Standardへの移行#f51240e8]] [#f51240e8] 現在は、[[ASP.NET Core]]の既定のパッケージ・マネージャになっている。 **bower [#q464638b] ***概要 [#laa72ac9] -ブラウザで使用するCSS/JavaScriptライブラリはコチラから取得する。 -既定の[[Visual Studio]]と上手く統合されているとは言い難いので、 --CLIを直接実行するか、 --Extensionを使用して、 >実行する必要がある。 ※ バッチ化することを考慮すると、CLIの方が良さそう。 ***参考 [#zc8e67b1] -microsoft.com --Visual Studio - Bower Web 開発用最新ツール~ https://msdn.microsoft.com/ja-jp/magazine/mt573714.aspx --ASP.NET Core での Bower でクライアント側のパッケージを管理します。 | Microsoft Docs~ https://docs.microsoft.com/ja-jp/aspnet/core/client-side/bower -その他 --Visual Studio 2013 で Bower を使う - miso_soup3 Blog~ http://miso-soup3.hateblo.jp/entry/2014/11/26/173021 --ASP.NET 5 と Visual Studio 2015 では Bower と Grunt が~ 標準になるみたいなので勉強してみた - しばやん雑記~ http://blog.shibayan.jp/entry/20141125/1416882231 --ASP.NET Core を始める際に知っておきたい~ Web フロントエンドツールの種類と最新トレンド - tkiryu’s blog~ http://tkiryu.hatenablog.com/entry/2017/02/15/084115 **npm [#e4af8da1] ***概要 [#a2ff3725] -[[テンプレートからangularやreactを選択>#q6846182]]すると[[NuGet>#f51240e8]]に加え、[[npm>#e4af8da1]]が使える状態で初期化される。 -今後、主流は、「[[Visual Studio Code]]」+「[[npm>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?npm]] ,etc.の[[Node.js>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?JavaScript#q9fc6e24]]系のツール」になる可能性がある。 -コチラも、既定の[[Visual Studio]]と上手く統合されているとは言い難いので、 --CLIを直接実行するか、 --Extensionを使用して、 >実行する必要がある。 ※ バッチ化することを考慮すると、CLIの方が良さそう。 ***参考 [#tc7cb86f] -ASP.NET MVC プロジェクトで npm と Nuget を使い分ける - tkiryu’s blog~ http://tkiryu.hatenablog.com/entry/2016/10/26/121651 -ASP.NET Coreで、bowerじゃなくてnpmから取得したパッケージをwwwrootに入れたい - Qiita~ https://qiita.com/kuluna/items/e1490d9e9d3ca96c8b75 **参考 [#f6608159] -JavaScript - .NET 開発基盤部会 Wiki > その他 > パッケージ・マネージャ~ https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?JavaScript#i6813c82 *構成 [#r671d85d] **初期化 [#h3f1560e] ***Web サーバ [#q71c1ade] -[[launchSettings.json>#n27e559b]] ***スタートアップ [#d80db398] -[[Program>#e29db89b]] -[[Startup>#g42f0f08]] -[[bundleconfig.json>#q4e3ad8b]] ***複数環境の構成 [#zf8dc3f4] ASPNETCORE_ENVIRONMENT環境変数を使用して複数の構成を初期化できる。 -環境名 --Development --Staging --Production -対象 --[[launchSettings.json>#n27e559b]]の設定 --[[Startup>#g42f0f08]] ---クラス内での各種設定 ---クラス.メソッド内での各種設定 --[[EnvironmentTagHelper>#pa10e781]]の利用 -参考 --Microsoft Docs ---ASP.NET Core で複数の環境を使用する~ https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/environments **[[DI]]による構成 [#l75d198a] ***[[ASP.NET Core における DI]] [#gab0902e] ***[[ミドルウェアのインジェクション>#q264650f]] [#jff1cf48] **[[Session構成>ASP.NET CoreのSession利用方法#dc88a7e0]] [#aa2edea7] *ライブラリ [#d22b8a0b] **[[System.Web>.NET Standardへの移行#i5893ae7]] [#i5893ae7] **[[Microsoft.Owin>.NET Standardへの移行#gce2c3f9]] [#gce2c3f9] **[[NuGetライブラリ>.NET Standardへの移行#sec5fcfd]] [#v0b54c37] **未分類のAPI [#ie8a29fa] -Request.IsAuthenticated が無い~ User.Identity.IsAuthenticated に置き換える。 -HttpNotFound, HttpStatusCodeResult が無い~ NotFound / StatusCode メソッドを利用する。 -OutputCache が無い~ ResponseCache を使うか、データキャッシュに実装しなおす。 *ミドルウェア [#b38227ce] サービス、フレームワークなどと呼ばれることもある。 **[[ミドルウェアのインジェクション>ASP.NET Core における DI#i8e6b534]] [#q264650f] **ミドルウェアの種類 [#oc66000e] ***初期値 [#i8f1ee8c] IServiceCollectionに含まれる初期値 -シングルトン --System.Diagnostics.DiagnosticSource --System.Diagnostics.DiagnosticListener --Microsoft.AspNetCore.Hosting.IHostingEnvironment --Microsoft.AspNetCore.Hosting.Server.IServer --Microsoft.AspNetCore.Hosting.IStartup --Microsoft.AspNetCore.Hosting.IApplicationLifetime --Microsoft.Extensions.Logging.ILoggerFactory --Microsoft.Extensions.Logging.ILogger<T> --Microsoft.Extensions.Options.IOptions<T> --Microsoft.Extensions.ObjectPool.ObjectPoolProvider -一時的 --Microsoft.AspNetCore.Hosting.IStartupFilter --Microsoft.AspNetCore.Http.IHttpContextFactory --Microsoft.AspNetCore.Hosting.Builder.IApplicationBuilderFactory --Microsoft.Extensions.Options.IConfigureOptions<T> ***MVC6 [#h778f299] -[[Lib側>.NET Standardへの移行#w703d092]]の変更 -[[UI側>ASP.NET Core MVC]]の変更 ***WebAPI [#x199e689] -[[Lib側>.NET Standardへの移行#kde6f3a7]]の変更 -[[UI側>ASP.NET Core MVC#s35b1ee8]]の変更 ***SPA [#q6846182] -下記が参考になる。 --Lib側の変更(なし) --[[UI側>ASP.NET Core MVC#ad2e01e9]]の変更 -その他 --[[ASP.NET Core SPAテンプレート]] --[[Visual Studio CodeによるSPA開発]] ***[[認証>ASP.NET Core における 認証]] [#cd9d3413] -APIが異なるもよう。 -[[ASP.NET Forms認証]]や[[ASP.NET Identity]]に依存している場合、広範囲に修正が必要になる。 ***[[EF Core>Entity Framework Core]] [#kfcd63f7] 非互換がある模様。 -FindAsync メソッドが無い。 -SqlQuery メソッドが無い。 *旧情報(1.0時代) [#w638852f] **機能面 [#h4eca79e] -[[ASP.NET Core]]と[[ASP.NET]] 4.6 は別物 --ASP.NET 4.6:~ 従来の[[ASP.NET]]の後継 --[[ASP.NET Core]]:~ 次世代の[[ASP.NET]]と呼ばれていたもので、[[.NET Core]]ランタイム上で動作する。 -[[ASP.NET Core]]に[[ASP.NET Web Forms]]は無いので、 --[[ASP.NET Web Forms]]からの移行は不可能。 --[[ASP.NET MVC]](MVC5)から[[ASP.NET Core MVC]](MVC6)への移行パスを検討する。 **検討 [#r3fe298f] 立ち位置によってかなり変わってくる。 ***旧資産に縛られている場合 [#ef0372db] 旧資産に縛られている場合はなかなか移行できないと思う。 -縛られている場合、[[ASP.NET Core]]に振り切ってイイか?は、 --例えば、[[SaaS開発>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?SaaS%E8%A8%AD%E8%A8%88%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88]]の方でChartControlなどを使っているが、~ [[ASP.NET Core]]ではソコまでの機能拡充がされる気配が今の所無いと思う。~ --[[Linux>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Linuxを触ってみる。]]も必須の要件ではないし、ビジネス・アプリケーションの、~ [[Dynamics CRM]]では[[Web Forms (ASPX)>ASP.NET Web Forms]]が現役だったりする。 >と、個人的には(現段階では、まだ、)結構微妙と考えている。 -[[下記の参考情報を見ると>#lba9bf32]]、現状、マイグレーションも困難である模様。~ とは言え、時代に追随するためにはどこかのタイミングで飛び移る必要はある気はする。~ しかし、なんとなく、まだ機が熟していないのかな?という感じの情報が散在している。~ ***旧資産から解放された場合 [#l4cd5e2a] 旧資産から解放された場合は、思い切ったシフトができると思う。 Windowはエンタープライズでの利用が主であるが、 [[選定基準>#ab7cfef1]]に合致する場合、思い切ったシフトができると思う。 ***所感 [#t9c0710b] -[[下記の参考情報>#lba9bf32]]を参照すると、[[ASP.NET Core]](1.0)は、不安定で変更が多い。 -例えば、細かい話、[[ASP.NET Identity]]のPasswordHasherの実装が違う。~ 既存データでウワモノ以降などでは、更に難易度が上がる気配も...。 -- https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.Core/PasswordHasher.cs --https://github.com/aspnet/Identity/blob/dev/src/Microsoft.AspNetCore.Identity/PasswordHasher.cs -このように、2017年12月 現在、[[ASP.NET Core]]は、まだ安定しているとはいえないが、 --2017年8月、[[ASP.NET Core]] 2.0に公開され、 --[[ASP.NET MVC]](MVC5)が、2015年2月以降、更新されていないので、 >今後、メインストリーム、新技術サポートが、[[MVC6>ASP.NET Core MVC]](MVC6)に移っていく可能性がある。 **参考 [#lba9bf32] ***移行事例 [#l93ed9a4] -Hello World, [[ASP.NET Core]] 1.0! – とあるコンサルタントのつぶやき~ https://blogs.msdn.microsoft.com/nakama/2016/07/07/aspnetcore10/ -neue cc - LightNode 2 - OWINから[[ASP.NET Core]]への移植実例~ http://neue.cc/2016/07/28_535.html -ASP.NET 5、.NET Core への移行作業をしてみた感想 - Qiita~ http://qiita.com/creativewebjp/items/958af200fed9c7bd60ee -サイトを ASP.NET Core + .NET Core で作り直しました - 😊ソフトウェア開発者のブログ~ https://creativeweb.jp/archive/20160223 -Aspnet mvc 6の今を紹介~ https://www.slideshare.net/makotonishimura108/aspnet-mvc-6-54327431 ***バグ、変更 [#o3883a11] -開発者を苦しめる.NETのHttpClientのバグと紛らわしいドキュメント~ https://www.infoq.com/jp/news/2016/09/HttpClient -.NET Core は project.json の廃止を予定している~ https://www.infoq.com/jp/news/2016/08/project-json ***on [[.NET Core]] or .NET Framework [#q3aa806b] [[ASP.NET Core]]のプロジェクト・テンプレートに、 -[[ASP.NET Core]] Web Application ([[.NET Core]]) -[[ASP.NET Core]] Web Application (.NET Framework) があったが([[ASP.NET Core MVC]] のプロジェクト・テンプレート)、~ 時点から サポートプラットフォームは .NET Core のみに絞られた。 -ASP.NET Coreが.NET Frameworkサポートを終了~ https://www.infoq.com/jp/news/2017/06/ASPNET-Core-2 これを使用した場合、OS間の移行(Linux <---> Windows)が可能になる模様。 ***その他 [#e3b101b3] -しばやん雑記 --既存の ASP.NET Web API アプリケーションを ASP.NET Core MVC 1.0 へマイグレーションしてみた~ http://blog.shibayan.jp/entry/20160628/1467113657 --ASP.NET MVC アプリケーションを ASP.NET Core MVC にマイグレーションしようとして挫折した話~ http://blog.shibayan.jp/entry/20160629/1467209826 -clock-up-blog --ASP.NET MVC と ASP.NET Core MVC の名前と機能と採用判断の話など~ http://blog.clock-up.jp/entry/2017/07/26/aspnet-core-mvc-start --.NET Framework 上に構築した ASP.NET Core プロジェクトのプラットフォームを後から .NET Core に変更する~ http://blog.clock-up.jp/entry/2017/08/16/aspnetcore-platform-change *参考 [#nb7b70ce] **microsoft.com [#td39a431] ***[[ASP.NET Core]] 2.0 移行情報 [#d51f6809] (Microsoft Docs) -ASP.NET Core への移行~ https://docs.microsoft.com/ja-jp/aspnet/core/migration/ --ASP.NET から ASP.NET Core 2.0 への移行~ https://docs.microsoft.com/ja-jp/aspnet/core/migration/proper-to-2x/ --ASP.NET MVC から ASP.NET Core MVC (1.x) への移行~ https://docs.microsoft.com/ja-jp/aspnet/core/migration/mvc ---MVC~ https://docs.microsoft.com/ja-jp/aspnet/core/migration/mvc ---構成~ https://docs.microsoft.com/ja-jp/aspnet/core/migration/configuration ---認証と ID~ https://docs.microsoft.com/ja-jp/aspnet/core/migration/identity ---Web API~ https://docs.microsoft.com/ja-jp/aspnet/core/migration/webapi ---HTTP モジュールからミドルウェアへ~ https://docs.microsoft.com/ja-jp/aspnet/core/migration/http-modules --ASP.NET Core 1.x から 2.0 への移行~ https://docs.microsoft.com/ja-jp/aspnet/core/migration/1x-to-2x/ ---認証と ID~ https://docs.microsoft.com/ja-jp/aspnet/core/migration/1x-to-2x/identity-2x -Web サーバ ホスティング --ASP.NET Core でのホスティング~ https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/hosting --ASP.NET Core への Kestrel Web サーバーの実装~ https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/servers/kestrel -スタートアップ --ASP.NET Core でのアプリケーションのスタートアップ~ https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/startup --ASP.NET Core で複数の環境を使用する~ https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/environments -その他 --ASP.NET Core で複数の環境を使用する~ https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/dependency-injection#replacing-the-default-services-container ***.NET API Browser [#j6b71fa5] https://docs.microsoft.com/en-us/dotnet/api/index -ASP.NET Core API Reference~ https://docs.microsoft.com/en-us/dotnet/api/index?view=aspnetcore-2.0 **その他 [#m1ebf9f0] ***ASP.NET Core ClockUpTips [#r0ea2e31] -ASP.NET Core ClockUpTips~ http://aspnet-core.clock-up.jp ---- Tags: [[:.NET開発]], [[:.NET Core]], [[:ASP.NET]], [[:ASP.NET MVC]], [[:移行]]