Uriインスタンス (コンストラクターとTryCreate ファクトリ メソッド) を作成するメソッドでは、これまで URI 文字列の長さが約 65,000 文字に制限されています (正確な制限は入力形式によって若干異なります)。 これらの制限は取り払われており、インスタンスの継続時間に実質的に上限がありません。
導入されたバージョン
.NET 10
以前の動作
以前は、長さが約 65,000 文字を超える Uri インスタンスを作成できませんでした。 次の例のようなコードは、"無効な URI: Uri 文字列が長すぎます" というメッセージを含む UriFormatException を発生させました。
new Uri($"https://host/{new string('a', 100_000)}");
新しい動作
.NET 10 以降では、大量のデータを含む Uri インスタンスを作成できるようになりました。 例えば次が挙げられます。
string largeQuery = ...;
return new Uri($"https://someService/?query={Uri.EscapeDataString(largeQuery)}");
削除された制限は、大量のデータを運ぶ最も実用的なコンポーネントとして、パス、クエリ、フラグメントに主に適用されます。 スキームやホストなどのコンポーネントでは、引き続き一部の長さの制限が適用される場合があります。
stringの長さの制限に近づく際の実用的な制限も適用されるため、Uriを使用して 10 GB のファイルを表すことはできません (また、使用する必要もありません)。
破壊的変更の種類
この変更は 動作の変更です。
変更の理由
ほとんどの HTTP サーバーでは、要求で受け入れる URL に厳密な長さの制限が適用されます。 制限は一般に、 Uriの以前の制限よりもはるかに低くなります。 ただし、 Uri は URI に似た情報に対する .NET の事実上の交換の種類であるため、以前の制限では、API コントラクト全体で Uri の使用を削除する以外に、適切な回避策なしに、一部のシナリオでの使用が制限されています。
大規模な Uri の主なシナリオは次のとおりです。
-
data:uris は、Base64 でエンコードされた任意のバイナリ BLOB を含みます。 これらは、HTTP 要求行の外部で送信される場合があります。 たとえば、要求本文の一部である可能性があるため、任意の大きさにすることができます。 Uri を使用して、より大きなファイルを含むデータ URI を表すようになりました。 - 大きなクエリ文字列。 Uri は、HTTP 要求の一部として送信されなくても、システム間の交換の種類としてよく使用されます。 多くの場合、ユーザー要求情報はクエリ文字列の一部としてエンコードされるため、新しい動作により、データ量が増えてもこのようなシナリオが可能になります。
推奨されるアクション
ほとんどのユーザーには、アクションは必要ありません。
Uriに依存して入力検証の一環として長さの制限を適用する場合は、Uri インスタンスを構築する前の手順として、長さチェックを自分で実行する必要があります。 ほとんどの HTTP サーバーでは、実際にははるかに厳密な長さの制限が適用されるため、非常に長い入力では、HTTP 要求の一部として送信されたときにエラーが発生する可能性が既に高かったです。 シナリオによっては、Uri 以前の検証よりもさらに厳密な長さの検証を行うことで、メリットを見出すことができるかもしれません。
影響を受ける API
- Uri
- System.Uri.TryCreate
- Uriインスタンスに関する情報を返すすべてのUriメンバー。次に例を示します。
.NET