最近、プロジェクトを .NET 6 から .NET 8 に移行しているときに、私のチームメイトの Jeremy Chan が、.NET 7 以降に現れたと思われるモデル バインディングの動作における文書化されていない変更を発見しました。この変更は、公式の .NET では明確に説明されていません。ドキュメントに記載されているため、開発者が見落としやすいものである可能性があります。
問題を説明するために、単純な Web API プロジェクトから始めて、変更を強調する簡単なコントローラー メソッドを検討してみましょう。
[ApiController] public class FooController { [HttpGet()] public async void Get([FromQuery] string value = "Hello") { Console.WriteLine($"Value is {value}"); return new JsonResult() { StatusCode = StatusCodes.Status200OK }; } }
次に、.NET 6 プロジェクトと .NET 8 プロジェクトの両方で nullable が有効になっていると仮定します。
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <Nullable>enable</Nullable> ... </PropertyGroup> ... </Project>
.NET 6 では、/foo?value= を使用してエンドポイントを呼び出すと、次のエラーが表示されます。
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "00-5bc66c755994b2bba7c9d2337c1e5bc4-e116fa61d942199b-00", "errors": { "value": [ "The value field is required." ] } }
ただし、メソッドを次のように変更するとエラーは発生しません。
public async void Get([FromQuery] string? value) { if (value is null) Console.WriteLine($"Value is null!!!"); else Console.WriteLine($"Value is {value}"); return new JsonResult() { StatusCode = StatusCodes.Status200OK }; }
/foo?value= を使用してエンドポイントを呼び出したときのログは、「Value is null!!!」となります。
したがって、値のないクエリ文字列は null として解釈されることがわかります。そのため、値が null 値を許容しない場合に検証エラーが発生します。
したがって、エンドポイントを .NET 6 で動作させるには、値をオプションにするために次のように変更する必要があると言えます。これにより、値が必須フィールドとしてマークされません。
public async void Get([FromQuery] string? value = "Hello")
ここで、/foo?value= を指定してエンドポイントを呼び出すと、「Value is Hello」というログが出力されることになります。
次に、同じ元の設定を使用して .NET 8 ではどうでしょうか (つまり、以下に示すように)。
public async void Get([FromQuery] string value = "Hello")
.NET 8 では、/foo?value= を指定してエンドポイントを呼び出すと、「Value is Hello」というログが出力されるのがわかります。
それで、ここで何が起こっているのでしょうか?
.NET 7 では、新しいインターフェイス IParsable が導入されました。したがって、.NET 7 以降、IParsable.TryParse API はコントローラーのアクション パラメーター値をバインドするために使用されます。
初期調査によると、.NET 7 以降では、内部で新しいモデル バインディング実装が使用されており、それがこの問題の原因となっていることがわかっています。
KOSD (Kopi-O Siew Dai) は、私が楽しんでいるシンガポール コーヒーの一種です。基本的にはコーヒーに少し砂糖を加えたものです。このシリーズは、私がコピオ シューダイを飲みながら得た技術的な知識についてブログを書くことを目的としています。
以上が[KOSD] .NET から .NET8 への FromQuery モデル バインディングの変更の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。