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 ГБ.

Тип разрушающего изменения

Это изменение поведения.

Причина изменения

Большинство HTTP-серверов применяют строгие ограничения длины для URL-адресов, которые они готовы принять в запросах. Ограничения, как правило, гораздо ниже Uriпредыдущих ограничений. Однако так как Uri является де-факто типом обмена в .NET для сведений, таких как URI, предыдущие ограничения ограничивают его использование в некоторых сценариях без хороших обходных решений, помимо удаления использования Uri всех контрактов API.

Основные сценарии для больших Uri размеров:

  • data: URI, содержащий произвольные двоичные blob-объекты, закодированные в Base64. Они могут передаваться за пределами строки HTTP-запроса. Например, они могут быть частью текста запроса и, следовательно, могут быть произвольными. Uri теперь можно использовать для представления URI данных, содержащих большие файлы.
  • Большие строки запроса. Uri часто используется в качестве типа обмена между системами, даже если он никогда не будет отправляться в рамках HTTP-запроса. Сведения о запросе пользователя часто кодируются как часть строки запроса, поэтому новое поведение позволяет использовать такие сценарии даже при росте объема данных.

Для большинства пользователей не требуется никаких действий.

Если вы полагаетесь на Uri введение ограничений длины в рамках проверки входных данных, необходимо выполнить проверку длины самостоятельно, желательно как шаг перед созданием экземпляра Uri . Так как большинство HTTP-серверов применяют гораздо более строгие ограничения длины, очень длинные входные данные уже могут привести к сбоям при отправке в рамках HTTP-запроса. Возможно, вы обнаружите, что ваш сценарий может воспользоваться выполнением даже более строгой проверки длины, чем Uri было сделано ранее.

Затронутые API