タイトルの通り、ASP.NET Core 2.0から2.1へアップグレードしたので、その際の記録です。

アップグレードのため、調査開始

ここの図にある通り、当サイトはASP.NET Core 2.0 1 で開発したWebアプリケーションをDockerで実行しています。

.NET Core 2.1はLTS版となるので移行が推奨されています。
Announcing .NET Core 2.1 | .NET Blog

2018年6月現在、当サイトはまだ立ち上げたばかりなのでさっさとアップグレードすることを決意しました。
実は、当サイトの開発自体はASP.NET Core 1.1から始めていて、プロジェクトソースのアップグレードはこれで2回目となります。

前回はさほど大きな問題はありませんでしたが、今回はどうなるか...

調査結果

Webアプリのアップグレード自体は、しばやん雑記で紹介されている通りっぽいので楽観視。いつもお世話になってます。

Dockerコンテナもやっぱりアップグレードが必要かな?と調べていると、ここに、

Latest images for 2.1 and newer are now available on microsoft/dotnet. See this link for more details about migrating to 2.1.

という記載があります。
上記の this link を覗いてみると詳しく書いてありました。DockerfileのFROMを書き換えるだけかな?
そして、またまたしばやん雑記に詳しく書いてありました。ありがたい。

これで大体の材料は揃ったと思うので、後は調理するだけですね。

作業開始!

初っぱなからいきなり小一時間調査が必要な事態になりました...。

Visual Studioで.NET Core 2.1が選べない

Visual Studio 2017でWebアプリケーションプロジェクトのプロパティからターゲットフレームワークを変更しようとしたのですが、なんと2.1が選択できません。
2.1が選択できない!

Visual Studioは最新版になってますし、Visual Studio Installerの個別タブにはこれといったものがありません。
1.1から2.0にしたときにはこんなトラブルなかったのになぁ。

.NET Core SDKのインストールが必要

調べた結果、.NET Core 2.1に対応したSDKを別途インストールしないといけないようです。
stack overflowの記事を見ると、SDKのバージョンは2.1.3以上が必要な模様。わたしの環境ではインストール済みのSDKのバージョン番号が2.1.2でした。
ここ(GitHubのdotnet/cliのissue)に色々書いてあるようなのですが、長くて疲れました。英語スラスラ読めるようになりたい...。

気を取り直して、公式サイトから最新SDKをインストールします。SDK 2.1.3のx64版をインストールしました。

インストール後、Visual Studio 2017で再度確認すると、ターゲットフレームワークに.NET Core 2.1が出てきました。ふぅ。

ASP.NET Core 2.1で新規Webプロジェクトを作ってみる

作業を続ける前に、公式のガイドの通り、一度新規プロジェクトを構築してみて、比較しながら変更点を適用していこうと思いました。
(最初からやれ→自分)

ASP.NET Core 2.1のプロジェクトでは開発時もhttpsを使用できるようになっています。
新規プロジェクトのダイアログ
当サイトではリバースプロキシとしてnginxを使用している上、開発時までhttpsが必要とは思えなかったのですが、いい機会なのでチェックを付けた状態と付けていない状態でそれぞれ作成してみました。

差分があったのは以下のファイルです。

  • プロジェクトファイル (*.csproj) ... httpsチェックが付いている方に UserSecretsIdが追加されている。証明書のキーでしょうか
  • Dockerfile ... https用のポート番号が追加されている
  • Startup.cs ... Configureメソッド内に app.UseHsts()app.UseHttpsRedirection()が追加されている

ふーむ。今一つよくわかりません。
とりあえず、いずれも無しで適用してみます。

ビルドすると Microsoft.WindowsAzure.Storage.Blob が無い旨のエラーが発生

一通り編集が終わったのでビルドしてみると、エラーになりました。

エラーメッセージを見ると、Microsoft.WindowsAzure.Storage.Blobが無い旨のメッセージが表示されていました。

ASP.NET Core 2.0ではMicrosoft.AspNetCore.Allというメタパッケージを使用していたのですが、これを2.1ではMicrosoft.AspNetCore.Appというメタパッケージに変更しています。
Microsoft.AspNetCore.AllパッケージにはWindowsAzure関連も含まれていたということなのでしょう。

NuGetから該当しそうなパッケージをインストールしました。
NuGetからWindowsAzure.Storageを追加
(WindowsAzure.Storageというパッケージをインストール)

該当箇所のエラーが消えました。行けるかな。

もう一カ所、Startup.csにapp.UseBrowserLink();という記載が残っていてエラーが起きましたが、これを消してビルドすることで無事起動しました。
やったー!

public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
  ILoggerFactory loggerFactory, IServiceScopeFactory scopeFactory)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();   // ←ここもエラーになっていた
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{slug?}")
            .MapXmlRpcRoute(loggerFactory);
    });

終わりに

業務用のシステム開発をしていると、ランタイムのバージョンアップをすることは極まれです。
有ったとしても、業務機能要件の追加のついでに行われることがほとんどではないでしょうか。

事前の情報収集で互換性の問題をクリアできると見込んだとしても、追加要件以外で不具合が出てしまう可能性がゼロとは言い切れないので、全機能のテストにかかる工数がどうしても発生してしまいます。躊躇したくなる気持ちは理解できます。

これをどうにかしようと思ったら、ランタイムで影響が出る範囲がなるべく小さくなるようにして、順次入れ替えて行くような設計になるのでしょうか。
スモールスタートで始めたシステムに機能追加で大きくしていくような場合なら可能かもしれません。

どちらにしても、そのシステムのライフサイクルを常に頭の片隅に置いた上で設計していかないといけないな、と思います。

まぁ、当サイトは個人ブログなので、無計画システムの最たるものですが...(笑

今回の記事も、技術的な情報はほとんど無く、ただの記録になってしまいました。
誰かの参考になることを祈って締めくくりたいと思います。


  1. 2021/12/14現在はASP.NET Core 6.0になっています。