Uri 已删除长度限制

创建 Uri 实例的方法(构造函数和 TryCreate 工厂方法)历来将 URI 字符串的长度限制为大约 65,000 个字符(具体限制因输入格式而异)。 这些限制已被解除,因此实际上对实例的长度 Uri 没有上限。

已引入的版本

.NET 10

以前的行为

以前,无法创建 Uri 长度超过 65,000 个字符的实例。 如以下示例中的代码抛出 UriFormatException,信息显示“URI 无效:URI 字符串太长”。

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 是 .NET 中事实上的 URI 型信息交换类型,因此,上述限制导致在某些方案中无法有效使用它,除非通过删除 API 合同中的 Uri,否则没有好的解决方案。

大型 Uri 的主要场景有:

  • data: uri,其中包含在 Base64 中编码的任意二进制 blob。 这些内容可能在 HTTP 请求行之外传输。 例如,它们可能是请求正文的一部分,因此可以任意大。 Uri 现在可用于表示包含较大文件的数据 URI。
  • 大型查询字符串。 Uri 通常用作系统之间的交换类型,即使永远不会作为 HTTP 请求的一部分发送。 用户请求信息通常编码为查询字符串的一部分,因此新行为可实现此类方案,即使数据量也会增加。

对于大多数用户,无需执行任何操作。

如果你依赖 Uri 在输入验证过程中施加长度限制,则现在必须自行执行长度检查,最好是在构造 Uri 实例之前执行一个步骤。 由于大多数 HTTP 服务器在实践中强制实施更严格的长度限制,因此在作为 HTTP 请求的一部分发送时,很长的输入可能会导致失败。 你可能会发现,你的场景将从执行比 Uri 之前更严格的长度验证中受益。

受影响的 API