しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure App Service で ASP.NET Core 2.2 と ANCM v2 が使えるようになった

.NET Core 2.2 リリース時には 12 月末までの対応が宣言されていた Azure App Service での .NET Core 2.2 対応ですが、全リージョンへのデプロイが完了したようです。

デプロイのタイミングによっては .NET Core 2.2 はインストールされていても、ASP.NET Core Module (ANCM) v2 がインストールされていないという状態に一部なっていたみたいです。

今は ANCM v2 のインストールまで完了した状態になっているので、csproj を弄って修正する必要なく、そのまま App Service で動かすことが出来るようになってます。

ちなみに ASP.NET Core 2.2 からはプロジェクトを Visual Studio で作成すると、デフォルトで ANCM v2 と In-Process Hosting が有効化されています。2.1 からの移行時には少し気を付けたい部分です。

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
  </PropertyGroup>


  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
  </ItemGroup>

</Project>

AspNetCoreHostingModel の値を InProcess から OutOfProcess に変更すると、w3wp の下に dotnet プロセスが立ち上がるこれまでと同じ仕組みに戻ります。

In-Process Hosting を有効化すると w3wp が直接 .NET Core をホスティングする形になるので、以下のように Kudu などで w3wp が .NET のアセンブリを読み込んでいることが確認できます。

f:id:shiba-yan:20181223222658p:plain

子プロセスとして dotnet が立ち上がっていないことも同時に確認できます。開発チームはエラーハンドリングとパフォーマンス面で有利だと言ってます。

ANCM での In-Process に関しては .NET Core 2.1 の時に少し書いたので参考にしてください。

この変更により Visual Studio の Cloud Explorer からリモートデバッグを行おうとすると、In-Process Hosting の場合は以下のようなエラーが出てデバッガをアタッチ出来なくなります。

f:id:shiba-yan:20181223224659p:plain

ぶちぞう RD 曰く、前は ASP.NET Core でエラーになっていたらしいので、Cloud Explorer のアップデートで解決しそうですが、リモートデバッグが必要になった場合には OutOfProcess に切り替える必要があります。

実際に切り替えれば、以下のようにすんなりと Cloud Explorer からリモートデバッグが行えます。

f:id:shiba-yan:20181223224924p:plain

スナップショットデバッガーは動作を確認してないですが、こっちはクラッシュした時にダンプを取る仕組みなので、In-Process Hosting でも動作しそうな感じはします。

In-Process Hosting の効果が本当にどのくらいあるのか気になったので、パフォーマンスを Azure DevOps を使って確認しています。長くなりそうなので、それは別のエントリにまとめることにします。

少なくとも言えることは ASP.NET Core 2.2 の場合は In-Process の方がパフォーマンスが良いです。