ハンズオンMicrosoft は Linux が大好きですが、オープンソース OS 用の ASP.NET Core アプリケーションのコーディングと展開は、Windows を使用する場合と比べて少し面倒です。
Microsoftは2014年に、これまでWindows専用だった.NET Frameworkのオープンソースかつクロスプラットフォームなフォークである.NET Coreを発表しました。2年後にはバージョン1.0がリリースされ、現在はASP.NET Core 2.2とEntity Framework 2.2と共にバージョン2.2が最新版となっています。
.NET Core 3.0は現在も準備中です。プログラムマネージャーのリチャード・ランダー氏によると、現在「機能完成に非常に近づいている」とのことで、最終リリースは今年後半に予定されています。来年には、Microsoftが.NETプラットフォームの統合を目指しているメジャーリリース、.NET 5.0が登場する予定です。
つまり、.NET Core は実稼働環境に対応できる状態になってから3年が経過しており、十分な成熟度を示しています。クロスプラットフォームは重要な機能であり、Windows ではなく Linux にデプロイすることには、ライセンスフリーのサーバーオプションなど、明らかな魅力があります。
しかし、Visual Studio 2019を起動して、Webアプリケーションをビルドし、Linuxにデプロイするのはどれほど簡単なのでしょうか?これは、多くのプロバイダーが提供するユビキタスなLinuxホスティングのメリットを活かして、簡単なプロトタイプを作成するために実行したい作業です。
ASP.NET Core アプリケーションのフレームワークの選択 (クリックして拡大)
Visual Studio は、Microsoft の広大な IDE のどのコンポーネントをインストールするかに応じて、ASP.NET Core Web アプリケーション用の幅広いフレームワークを提供しています。これには、古い ASP.NET MVC(ただし、.NET Framework 専用のさらに古い Web フォームは除く)のほか、Angular、React.js、または Redux(状態を保存および更新するライブラリ)を使用した React.js が含まれます。
注意すべき点がいくつかあります。1つは、Reactのいずれかを使用すると、Node.jsへの依存関係が生まれることです。さらに、これらのフレームワークは優れたものですが、Microsoftの公式ドキュメントには使い方に関する詳細な情報があまりありません。もちろん、Reactコミュニティからも多くの支援を受けていますが、Visual Studioを使用している人はそれほど多くありません。むしろ、より広く使用されているVisual Studio Codeを使用する方が賢明かもしれません。
最も容易な方法は、ASP.NET MVCアプリケーションです。ASP.NET MVCはMicrosoftの発明であるため、Visual Studioユーザー向けにドキュメントが充実しています。
ただし、もう 1 つのポイントとして、認証オプションの 1 つをオンにすると、Visual Studio によってユーザー管理に役立つコードが生成されます。アプリケーションでは必ずユーザー管理が必要になります。
あまり知られていない点として、「個別のユーザーアカウント」を選択した場合、つまりアプリケーション専用のデータベースを使用する場合、アプリケーションはSQL Server用に構成されます。Azureにデプロイする予定であれば問題ないかもしれませんが、安価なLinuxホストを検討している場合は理想的とは言えません。MySQLやSQLiteなどの選択肢の方が便利です。別のデータベースマネージャーを使用するには、コードを修正する必要があります。
MicrosoftのVisual Studioテンプレートは、同社のORM(オブジェクトリレーショナルマッピング)レイヤーのクロスプラットフォーム版であるEntity Framework Core(EF Core)の使用を強く推奨しています。データベースのパフォーマンスが重要となるデータ集約型アプリケーションのコーディングには、EF Coreは最適な選択肢ではないかもしれません。一方で、小規模なデータベースを使用する多くのユースケースではEF Coreは便利です。プロトタイプには最適な選択肢です。
Sqlite を選択する場合、Microsoft.EntityFrameworkCore.Sqlite という便利な NuGet パッケージがあります。一方、MySQL は少し面倒です。この表に記載されている Oracle 公式プロバイダーを見ると、Oracle のコネクタの最新バージョンは EF Core 1.1 のみをサポートしていることがわかります。他には、247 万ダウンロードという確かな実績を誇る Pomelo.EntityFrameworkCore.MySql などの選択肢があります。
MySql用のPomeloライブラリは、Oracleが提供するものよりも互換性が広い。
今回はMySQLを使用します。Windows 10では、Windows版のMySQLをインストールするか、Windows Subsystem for Linuxを使用して実行できます。どちらの場合も、データベースを作成し、そのデータベースへの権限を持つユーザーを作成してから、ASP.NETアプリケーションに接続文字列を追加します。appsettings.jsonに接続文字列を追加します。その後、 Startup.csを開き、 と新しい接続文字列の名前を変更しますservices.AddDbContext
。Pomelooptions.UseMySql
パッケージをインストールすると、UseMySqlオプションが自動的に表示されます。
EF Core がユーザーデータベース用の移行を生成している可能性があるという、ちょっとした問題があります。移行は EF Core でデータベース構造の作成と更新に使用されます。SQL Server 固有の既存の移行は削除できます。その後、パッケージマネージャーを開いて、以下を入力してください。
Add-migration InitialCreate
に続く:
Update-database
すべてがうまくいけば、MySQL にユーザーデータベースが作成されます。アプリケーションには機能的な登録・ログインシステムが備わります。EF Core が動作していれば、データフォームアプリケーションの構築に必要なすべてのものが揃っています。コードの Models セクションにクラスを追加すると、ASP.NET MVC が CRUD (作成、取得、更新、削除) 機能を自動的にスキャフォールディングします。
Linux への展開についてはどうでしょうか?
いくつかの選択肢があります。Dockerコンテナでよろしければ、プロジェクトを右クリックし、「Dockerサポートを追加」を選択し、ターゲットOSとしてLinuxを選択してください。少しブラックボックスですが、Visual StudioとDockerを使えば動作するコンテナを作成できます。
ただし、この方法では古いLinux VMへのデプロイはできません。そのためには、「ビルド」メニューの「公開」をクリックし、 「フォルダーに公開」を選択してください。 「詳細設定」をクリックし、ターゲットランタイムとして「Linux-x64」を選択してください。
ASP.NET Core アプリケーションの公開設定
フレームワーク依存型と自己完結型のいずれかを選択することもできます。これは、.NET Coreランタイムをサーバー上で集中的にインストールして管理するか、アプリケーションと共にランタイム全体(この場合は約112MB)を展開するかを選択することになります。
長所と短所があります。自己完結型の展開はよりシンプルで、集中管理された環境との潜在的な非互換性を回避できますが、ディスク容量を無駄に消費し、ユーザーによるメンテナンスが必要になります。フレームワーク依存型の展開では、多くの場合、.NET Coreのダウンロードページにアクセスするか、Microsoftリポジトリなどを設定して使用する必要がありますapt-get
。
.NET CoreにはKestrelと呼ばれる独自の組み込みWebサーバーが搭載されており、設定によってはリバースプロキシの背後に配置する必要がある場合もありますが、リバースプロキシの使用をお勧めします。また、アプリケーションが自動的に実行されるようにサービスを設定する必要があります。PHP自体が動作していればアプリケーションが実行されるLAMP(Linux、Apache、MySQL、PHP)アプリケーションとは異なります。
うまくいきました!MySqlとASP.NET Coreでユーザーを登録する
幸いなことに、この設定により、デモアプリはDebian 8で問題なく動作しました。ただし、何らかの理由で事前設定されたwww-dataユーザーでは動作せず、代わりに新規ユーザーを作成しました。小さなVMでもパフォーマンスは良好です。
ただし、Visual Studio で Linux ルートを選択する場合、SQL Server を推奨するテンプレートから、MySQL の使用に関する問題、選択した Linux ターゲットに対する適切な手順の実行に至るまで、いくつかの摩擦があることは言わざるを得ません。
Microsoft Azure と Linux アプリ サービス、または Docker コンテナーを実行する別の手段を使用すると、ある面では問題が簡素化されますが、他の面では複雑になります。
それは重要なのでしょうか? 大規模なアプリケーションであれば全く問題ありませんが、試作段階のプロトタイプでは大きな違いが生じます。Windowsへの導入は容易で、ドキュメントも充実していることがわかります。これは企業の望む方向かもしれませんが、一方で、技術の発展を阻害する可能性もあります。®