[KOSD] .NET から .NET8 への FromQuery モデル バインディングの変更

Patricia Arquette
リリース: 2024-11-04 11:38:29
オリジナル
985 人が閲覧しました

[KOSD] Change of FromQuery Model Binding from .NET o .NET8

最近、プロジェクトを .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の状況

.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 (および.NET 7) の状況

次に、同じ元の設定を使用して .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 以降では、内部で新しいモデル バインディング実装が使用されており、それがこの問題の原因となっていることがわかっています。

参考文献

  • [API 提案]: 文字列は IParsable を実装する必要があります;
  • bool と string に ISpanParsable を実装させます。

KOSD (Kopi-O Siew Dai) は、私が楽しんでいるシンガポール コーヒーの一種です。基本的にはコーヒーに少し砂糖を加えたものです。このシリーズは、私がコピオ シューダイを飲みながら得た技術的な知識についてブログを書くことを目的としています。

以上が[KOSD] .NET から .NET8 への FromQuery モデル バインディングの変更の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!