きときと

日々のあれこれ ソフトウェアエンジニア

ASP.NET Core 1.1 のWebアプリケーションを ASP.NET Core 2.0 にマイグレーションする

公式に.NET Core マイグレーションの方法があがっているので、実践してみます。 docs.microsoft.com

シンプルな.NETCore1.1のWebアプリケーションをASP.NETCore2.0にマイグレーションして見ます。 Visual Studio 2017を操作してやっていこうと思います。

ターゲットフレームワークをアップデートする

対象プロジェクトを右クリック > プロパティ > ターゲットフレームワーク
.NET Core 1.1 → .NET Core 2.0へ変更する。
f:id:EF-0512:20170911212717p:plain

NuGetパッケージ更新

.NET Core 2.0 に伴い、パッケージの依存関係が整理され、
参照が1つのパッケージに統一されたようです。
それにあわせて依存関係を整理します。
docs.microsoft.com

  1. 依存関係を右クリック > NuGetパッケージの管理 からNuGetパッケージマネージャーを開く

  2. “インストール済み"タブ を開き、不要なパッケージをアンインストール
    f:id:EF-0512:20170911212910p:plain
    これを↓のような感じに
    f:id:EF-0512:20170911214129p:plain

  3. Microsoft.AspNetCore.Allをインストール
    検索してインストールする。
    f:id:EF-0512:20170911215218p:plain
    “インストール済み"タブは↓の様になります。
    f:id:EF-0512:20170911220122p:plain

.NET Core CLI tools を更新する

こちらはVisual Studio上からの更新方法がわからず、.csprjを直接更新しました。
私の環境では下記の様に更新しました。
■変更前

<ItemGroup>
  <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.1" />
</ItemGroup>

■変更後

<ItemGroup>
  <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
</ItemGroup>

PackageTargetFallbacの更新

こちらも直接.csprjを更新しました。
■変更前

<PropertyGroup>
    <PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>
</PropertyGroup>

■変更後

<PropertyGroup>
    <AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
</PropertyGroup>

Program.csの更新

公式ドキュメントを確認して更新する。

Startup.csの更新

公式ドキュメントには記載がなかったですが、 ASP.NET Core 2.0 への更新によりStartup.csの内容も変更されています。
Configurationの設定、configのバインド周りやロギングの設定記載が削除されています。
この辺りはもう少し詳細まで内容を確認しないとなと思っています。
コードは下記のように変更しました。
(新規にASP.NET Core 2.0アプリケーションを作成した場合と同じ内容です。)

public class Startup  
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();

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

デプロイ・実行

ローカルIISにサイトを構築、実行してみました。
普通にいけるかと思いきやエラーが出て少しはまりました。
(レスポンスが500だったのですが、ASP.NET Coreアプリでの、IIS詳細詳細エラー表示が上手くいかず、原因特定に時間がかかりました・・・)

dotnet run実行 → localhostへアクセスしてみると↓スタックトレースが。

Unhandled Exception: System.InvalidOperationException: No service for type 'Microsoft.AspNetCore.Mvc.ApiExplorer.IApiDescriptionGroupCollectionProvider' has been registered.

■エラー原因

NuGetパッケージ参照からMicrosoft.ApplicationInsights.AspNetCoreアンインストールしたため、_Layout.cshtml内のメソッド呼び出しで例外が発生していた。
https://developercommunity.visualstudio.com/content/problem/50735/applicationinsights-javascriptsnippet-exception-wi.html

■対応

_Layout.cshtmlから下記2行削除で正常に表示されました

@inject Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet JavaScriptSnippet

@Html.Raw(JavaScriptSnippet.FullScript)

■再実行

f:id:EF-0512:20170912214652p:plain
正常に表示されました。
デフォルトままのWebアプリケーションだったので特筆することはなかったですが、ASP.NET Core 2.0での変更点などを確認・整理できてよかったです。

参考

Exploring Program.cs, Startup.cs and CreateDefaultBuilder in ASP.NET Core 2 preview 1
ASP.NET Core RC2でHelloWorld~EntryPointとStartupも探る - ryuichi111stdの技術日記