2022-05-05: CoreWCF 1.0, MAUI RC 2, Microsoft Graph's Journey to .NET 6

Published on Thursday, 05 May 2022

トピックス

CoreWCF 1.0 has been Released, WCF for .NET Core and .NET 5+

https://devblogs.microsoft.com/dotnet/corewcf-v1-released/

CoreWCF 1.0 がリリースされた。

CoreWCF は .NET Core と .NET 5 以降向けに WCF (Windows Communication Foundation) を移植したものとなり、SOAP、NetTCP や WSDL の互換実装を提供するコミュニティー主導のフレームワーク。

CoreWCF は .NET Standard 2.0 のライブラリーとして提供され、.NET Framework と .NET Core, .NET ランタイムで動作することで .NET Framework プロジェクトなどからの移行を簡単にする。

記事ではサポートしている機能と未サポートの機能についても触れている。

.NET MAUI Release Candidate 2 - With 100% More Tizen

https://devblogs.microsoft.com/dotnet/dotnet-maui-rc-2/

.NET MAUI Release Candidate 2 がリリースされた。

Tizen のサポートが追加され Samsung Tizen を搭載するモバイルやテレビといったデバイスで MAUI アプリケーションの動作が可能となる。.NET 6 をサポートする Tizen Emulator は近くリリースされるとのこと。

記事ではプラットフォーム固有のソース管理(フォルダーや条件付きコンパイル)についても触れている。

Microsoft Graph's Journey to .NET 6

https://devblogs.microsoft.com/dotnet/microsoft-graph-dotnet-6-journey/

Microsoft Graph のサーバーを .NET 6 に移行するまでの話。(Microsoft Graph は Microsoft 365 の様々なデータにアクセスするための API ゲートウェイ)

記事では .NET 6 への道のりと移行のガイダンス、アップグレードのヒントが書かれている。

.NET 6 への道のりについて。

4年前は .NET Framework 4.6.2 上の ASP.NET を IIS で実行していて、現在は .NET 6 上の ASP.NET Core を Http.sys で実行している (.NET Core 3.1, .NET 5 を経て)。.NET Core 3.1 と .NET 6 では特に CPU 使用率の改善が見られた。

  • .NET Framework から .NET Core 3.1 で CPU 使用率が 30% 削減された (トラフィックは同量)
  • .NET Core 3.1 から .NET 5 では大きな差はみられなかった
  • .NET 5 から .NET 6 では CPU 使用率が 10% 削減された (トラフィックは同量)

4年前は10億リクエスト/日でコストがとても高く、現在では700億リクエスト/日の70倍となっているが10億リクエストごとの運用コストは91%削減されているとのこと。

.NET Core のインパクトについては .NET Framework から .NET Core 3.1 (Kestrel + ASP.NET Core その後 Http.sys) に移行した際のスループットの改善での比較を紹介している。

Standard_D3_v2 インスタンスで疑似的なトラフィックをかけた場合の RPS (リクエスト毎秒) と CPU 使用率を比較し、CPU 使用率 60% での RPS が古いスタックで約 350 RPS に対して、新しいスタックでは約 850 RPS となり、最終的に運用環境では 30% の CPU 使用率の削減が見られた。

ビルドシステムのモダナイゼーションについて。.NET Core への移行するために .NET Core と互換性のないツールチェーンを使用する内部ビルドシステムを使用していたため、初めにビルドシステムをモダナイズして MSBuild と dotnet コマンドをサポートする Visual Studio ツールチェーンを使用するモダンなビルドシステムに移行した。この移行は困難だったが、ビルドの高速化や保守が簡単になるなど、生産性の向上に寄与したとしている。

最後に移行することでコードベースを新しくでき、 Span や null 許容参照型 など新しい API と C# の機能による様々なメリットを得られたとしている。

次に移行ガイダンスでは ASP.NET から ASP.NET Core に移行する戦略を解説している。

  • Step 1. モダナイゼーションの構築
    • .NET Framework と .NET Core でのビルドシステムの構築
  • Step 2. アーキテクチャーの準備
    • ここでは3つのステージに分けるアーキテクチャをあげている
    • Stage 1. すべて .NET Framework
    • Stage 2. アプリケーションを .NET Standard にして .NET Framework / .NET Core 両対応
    • Stage 3. すべて .NET Core
  • Step 3. .NET Framework 依存の棚卸
  • Step 4. プロジェクトライブラリーから .NET Framework の依存を取り除く
  • Step 5. ブロックされることを避ける
    • 取り除くのが難しい依存関係を解消することをあきらめない
    • そのような状況となった場合は次のようなオプションがある
      • コードオーナーが .NET Standard 対応を行い、ブロックを解消するボランティアを行う
      • コードをフォークして互換性のあるものがリリースされるまで一時的に .NET Standard としてビルドする
      • 依存関係を .NET Framework で動作するコンソールアプリケーションやバックグラウンドサービスとして切り出す
      • 最終手段として .NET Framework プロジェクトやパッケージを参照して、互換 shim で動作させる (ビルドはできるかもしれないが保証はない)
  • Step 6. ASP.NET Core の新しい Web サーバープロジェクトを作成する
  • Step 7. A/B テストとロールアウトプラン
    • Stage 2 の状態で A/B テストを行う計画を作成する
  • Step 8. すべてのプロジェクトのターゲットを .NET Core にする

最後のアップグレードのヒントでは URI エンコーディングの取り扱いが ASP.NET と ASP.NET Core で違うこと、.NET 6 で導入された Dynamic PGO によるパフォーマンス向上といったものを紹介している。

Visual Studio 2022 for Mac Release Candidate

https://devblogs.microsoft.com/visualstudio/visual-studio-2022-for-mac-release-candidate/

Visual Studio 2022 for Mac RC がリリースされた。

記事では改めて Visual Studio 2022 for Mac での変更点を紹介している(アクセシビリティー対応、Apple Silicon ネイティブサポート、.NET 6 対応や UI の更新など)。

26.04.2022 LiveSharp goes free and open source - News – LiveSharp

https://www.livesharp.net/news/

LiveSharp が無料化しオープンソースとなった。

LiveSharp は .NET 上でホットリロードを実現するツールキットで今まで有償製品として提供されてきたが、.NET 6 でホットリロードがランタイムと SDK で提供されることとなり、有償ライセンス利用者が減ったことにより LiveSharp のサポートを継続できなくなったとのこと。

しかし .NET 6 のホットリロードは一部のシナリオで利用できず、そのようなケースでは LiveSharp はまだ役立つので無料とオープンソース化を行ったとしている。既存のサブスクリプションはすべてキャンセルされるとのこと。

YARP 1.1 is here with new requested reverse proxy features

https://devblogs.microsoft.com/dotnet/yarp-reverse-proxy-1-1-release/

YARP (Yet Another Reverse Proxy) 1.1 がリリースされた。

バージョン 1.1 での変更点は次の通り。

  • ゼロバイト読み込み
    • WebSocket や gRPC のようなストリーミングでアイドル状態のストリームが多い場合のメモリースケーリングが改善される
  • 複数値ヘッダーマッチング
    • ルートのヘッダーマッチングで複数値を持つヘッダーや同名のヘッダーが複数ある場合をサポート
  • HTTP/3 サポート
    • .NET 6 の HTTP/3 をサポートする
  • 複数の構成ソース
    • YARP の構成をソースコードや設定ファイルなど複数のソースから読み込み、マージすることが可能となった
  • Http.sys への移譲
    • YARP が Http.sys でホストされている場合、同マシン上で Http.sys を使用する他のプロセスにリクエストをルーティングできるように
  • ミドルウェアのための API
    • クラスターやルーティングといった構成にリアルタイムでアクセスできる API を追加。これにより A/B テストやローリングアップデートのような機能を実装できる
  • ドキュメンテーション

Remove C# implementation (individual packages will continue to be maintained through v2.46.x patches or moved to grpc-dotnet) by jtattermusch · Pull Request #29225 · grpc/grpc

https://github.com/grpc/grpc/pull/29225

gRPC (C-core) リポジトリーから C# の実装 (ツールを除く) が削除された。

モチベーションとしては C# 実装を削除することで C-core の大きな変更を簡素化する、gRPC の C#/.NET のサポート状況と一致させる(現在 Grpc.Core はメンテナンスモードで、grpc-dotnet が推奨実装)こととしている。

  • Grpc, Grpc.Core, Grpc.Core.Testing, Grpc.Core.NativeDebug, Grpc.Core.Xamarin は v1.46.x メンテナンスブランチに残され、セキュリティー修正などはそこで行われる
  • Grpc.Core.Api, Grpc.Auth, Grpc.HealthCheck, Grpc.Reflection は grpc/grpc-dotnet リポジトリーに移動する (これらは実装非依存)
  • Grpc.Tools は grpc/grpc の master に残り続ける (このツールはビルドインフラストラクチャーや最新の protoc などに依存してる部分が多く、簡単ではないため現時点ではそのまま)

Release Release v1.46.0 · grpc/grpc

https://github.com/grpc/grpc/releases/tag/v1.46.0

gRPC v1.46.0 (NuGet パッケージバージョンは 2.46.0) がリリースされた。

C# (C-core) ではシャットダウンされたチャンネルに対して Unary 呼び出しを行うとクラッシュする問題が修正されている。

.NET Package Maintenance (deprecation) · Issue #7420 · dotnet/core · GitHub

https://github.com/dotnet/core/issues/7420

.NET の NuGet パッケージメンテナンス (非推奨化) についてのアナウンス。

原則として .NET サポートポリシーに従いサポートから外れたものが非推奨 (Deprecated) としてマークされるようになる。そのほか dnx のような古いプレビューリリースも非推奨となる。

今後新しいパッケージがリリースされた場合は古いバージョンを非推奨としてマークするようになる。例えば .NET 6.0.10 がリリースされた後は 6.0.9 が非推奨としてマークされる。

AspNetCore 2.2 パッケージは .NET Framework の利用もあるため特別な扱いとなる。

来週からマーキングを開始したいとしていて何か問題がある場合は Issue にコメントが欲しいとしている。対象となるパッケージは .NET Package Deprecation list を参照のこと。

Release 11.0 · FluentValidation/FluentValidation

https://github.com/FluentValidation/FluentValidation/releases/tag/11.0

FluentValidation 11.0 がリリースされた。

.NET Core 2.1 のサポートの削除や、Sync-over-async 状況で例外をスローするようになるなど。

アーティクル、スライドなど

OpenTelemetry .NETの追加コード不要な計装ライブラリの最初のリリースが出たので試してみた | ドクセル

https://www.docswell.com/s/tanaka_733/ZJNQGK-opentelemetry-dotnet-automatic-instrumentation

OpenTelemetry.NET の追加コード不要で計測を実装するライブラリーの beta がリリースされたので使用してみるというスライド。

【C#】FCMでHTTP v1 APIを使ってプッシュメッセージ送信 - Qiita

https://qiita.com/piro_rin_piro/items/0d479b523996f475c809

Firebase Cloud Messaging の HTTP v1 API を使用するという記事。

Path.GetInvalidPathChars と Path.GetInvalidFileNameChars の違い - Qiita

https://qiita.com/FN_Programming/items/33e73566fcd5d666a865

Path.GetInvalidPathCharsPath.GetInvalidFileNameChars の違いについての記事。

例えば Windows 上では GetInvalidPathChars はパスとして無効な文字なので * を含まないが、GetInvalidFileNameChars はファイル名なので * は無効な文字として扱われている。またコメント欄では Unix 系の環境では null 文字のみがパスとして無効、ファイル名は null 文字と / だけとなっていることも。

2022年ASP.NETCore2.2~6.0の旅.pptx

https://www.slideshare.net/ssuser7f4bbb/2022aspnetcore2260pptx

.NET Core 2.2 (ASP.NET Core + EF Core) のアプリケーションを .NET 6 に更新した話のスライド。

.NET Core 2.2 → 3.1 → .NET 5 → .NET 6 へとアップグレードしていく間に出た対応を紹介している。

.NET Annotated Monthly | May 2022 | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2022/05/03/net-annotated-monthly-may-2022/

JetBrains の .NET 関連のまとめ2022年5月分の記事。

Case Study: Double performance in under 30 minutes

https://devblogs.microsoft.com/visualstudio/case-study-double-performance-in-under-30-minutes/

C# で展開コードを実装してプロファイルして30分で2倍のパフォーマンス改善を行えた話。

Stream.ReadByte の実装が1要素の byte 配列を確保するという実装となっていたため大量のアロケーションがあり GC が発生していたという話。

System.Text.JsonのJsonDocumentを使ってみる - Qiita

https://qiita.com/TheParkSider/items/7d85f730314dfe642c91

System.Text.Json の JsonDocument の使い方についての記事。

System.Text.JsonのJsonNodeを使ってみる - Qiita

https://qiita.com/TheParkSider/items/9632c7c5cb4c5b3d9717

System.Text.Json の JsonNode の使い方についての記事。

CsWin32 で Win32 API や COM を使ったアプリケーション開発を効率化する - しばやん雑記

https://blog.shibayan.jp/entry/20220501/1651339430

CsWin32 (Win32 API のラッパーコードを生成する Source Generator) を使用して Win32 API や COM をアプリケーションから呼び出すためのコツを紹介する記事。

.NET benchmarking and profiling for beginners

https://medium.com/ingeniouslysimple/net-benchmarking-and-profiling-for-beginners-62462e1e9a19

BenchmarkDotNet を使用したベンチマークとプロファイリングの入門についての記事。

Why isn't my ASP.NET Core app in Docker working?

https://andrewlock.net/why-isnt-my-aspnetcore-app-in-docker-working/

ASP.NET Core アプリケーションを Docker コンテナーで稼働させたときにうまく動かない問題があったことについての記事。Kestrel でバインドするアドレスが問題となっていたことについて解説している。

Improving ASP.NET Core Before It Ships 🚢

https://medium.com/justeattakeaway-tech/improving-asp-net-core-before-it-ships-3e44b6f65054

ASP.NET Core で見つかった問題を特定して修正したことについての記事。

.NET 6 の RC 版を展開して問題がなかったのでリリース版を展開したところデッドロックが発生し、状況証拠などから構成関連の処理(M.E.Configuration)であることを特定し、Visual Studio でコード上の原因を特定、バグ修正を行ったとのこと。(なおこの修正は .NET 6.0.3 で利用可能)

Generating sortable Guids using NewId

https://andrewlock.net/generating-sortable-guids-using-newid/

GUID の代わりに使用できる Snowflake アルゴリズムを使用した NewId パッケージの解説の記事。

Evil Monkeypatching in C# with Rosyln Source Generators

https://dev.to/martinjt/evil-monkeypatching-in-c-with-rosyln-source-generators-4g6f

Source Generator で global using を吐き出すことでモンキーパッチ(コード上で指しているものを上書き)するという手法についての記事。

Detect Breaking Changes in your GraphQL Schema automatically for Each Pull Request

https://medium.com/@TimHolzherr/detect-breaking-changes-in-your-graphql-schema-automatically-for-each-pull-request-77bbe261feef

Azure Pipelines で Pull request を作った際に GraphQL スキーマの破壊的変更を検出する手法についての記事。

Use the Query String to pass an array of selected values between Blazor Pages

https://jonhilton.net/blazor-deep-linking/

Blazor のページ間で選択した値の配列をクエリーストリングを使用して渡す方法についての記事。

Quickly Map Your NuGet Packages to Sources

https://devblogs.microsoft.com/nuget/quickly-map-your-nuget-packages-to-sources/

NuGet のパッケージソースマッピング (パッケージごとにどの NuGet サーバーを使うかの設定) を生成する PackageSourceMapper を紹介する記事。

Looking for a way to initialize IOptions<T> manually?

https://mahesh-more.medium.com/looking-for-a-way-to-initialize-ioptions-t-manually-4df4ca97b2b0

IOption<T> のインスタンスをユニットテストなどで簡単に作るにはどうするのかという記事。Options.Create というヘルパーがあるのでそれを使用する。

引数 null チェックの !!、取りやめ | ++C++; // 未確認飛行 C ブログ

https://ufcpp.net/blog/2022/5/double-bang-removed/

引数で null を受け入れないことを明示し、渡された場合に NullReferenceException をスローするという !! という文法がプレビューで導入されたが、フィードバックの結果差し戻しとなった件についての記事。

Windows Property System を使って C# から曲情報を取得する - しばやん雑記

https://blog.shibayan.jp/entry/20220504/1651658855

Windows が持つ Windows Property System と呼ばれるファイルのメタデータを取得・変更できる機能を使用して音楽の曲情報を取得する方法についての記事。

C# 11.0 の新機能 | ++C++; // 未確認飛行 C ブログ

https://ufcpp.net/study/csharp/cheatsheet/ap_ver11/

C# 11 での新機能について紹介している記事。

ライブラリ、リポジトリ、ツールなど

GitHub - Azure-Samples/Orleans-Cluster-on-Azure-App-Service: Sample application demonstrating a multiple-silo Orleans cluster running in Azure App Service.

https://github.com/Azure-Samples/Orleans-Cluster-on-Azure-App-Service

Azure App Service で動作する Orleans のクラスターのサンプルコード。

GitHub - IEvangelist/blazorators: This project converts TypeScript type declarations into C# representations, and use C# source generators to expose automatic JavaScript interop functionality.

https://github.com/IEvangelist/blazorators

TypeScript の型定義から Blazor の JavaScript 相互運用のための C# コードを生成する Source Generator。

サイト、ドキュメントなど

HTMX for ASP.NET Core Developers - .NET Guide

https://www.jetbrains.com/dotnet/guide/tutorials/htmx-aspnetcore/

ASP.NET Core で HTMX を使うチュートリアル。

Diagnostics tools overview - .NET Core

https://docs.microsoft.com/en-us/dotnet/core/diagnostics/

.NET Core/.NET で使用できる診断ツールについてのドキュメント。

猫でもわかるBlazor ECサイト編〜誰でもかんたんにECサイトを作る!〜(.NET6対応) - nekojoker - BOOTH

https://nekojoker.booth.pm/items/3813171

Blazor で EC サイトを実装することについてのまとめた本。Azure Active Directory B2C を使用しての認証、Stripe での決済などにも触れている。

ツイート

stackallocArrayPool を使った定型パターン。

Deep Dive

Update SDK and use 'u8' string literals by BrennanConroy · Pull Request #41449 · dotnet/aspnetcore

https://github.com/dotnet/aspnetcore/pull/41449

ASP.NET Core の中で使用されている UTF-8 文字列 (バイト配列)を u8 サフィックスによる UTF-8 文字列に変更する PR。