Udostępnij przez


Uri usunięto limity długości

Metody tworzące Uri wystąpienia (konstruktory i TryCreate metody fabryki) historycznie ograniczały długość ciągu identyfikatora URI do około 65 000 znaków (dokładne limity nieznacznie różniły się w zależności od formatu wejściowego). Te limity zostały zniesione, tak aby praktycznie nie było górnej granicy, jak długo Uri mogą być wystąpienia.

Wersja wprowadzona

.NET 10

Poprzednie zachowanie

Wcześniej nie można było utworzyć Uri wystąpienia, którego długość przekroczyła około 65 000 znaków. Kod podobny do poniższego przykładu zwrócił UriFormatException komunikat "Nieprawidłowy identyfikator URI: ciąg identyfikatora URI jest za długi".

new Uri($"https://host/{new string('a', 100_000)}");

Nowe zachowanie

Począwszy od platformy .NET 10, Uri można teraz tworzyć wystąpienia zawierające duże ilości danych. Przykład:

string largeQuery = ...;
return new Uri($"https://someService/?query={Uri.EscapeDataString(largeQuery)}");

Usunięte ograniczenia dotyczą głównie ścieżek, zapytań i fragmentów jako najbardziej praktycznych składników do przenoszenia dużych ilości danych. Składniki, takie jak schemat i host, mogą nadal wymuszać pewne limity długości. Praktyczne ograniczenia w miarę zbliżania się do ograniczeń string długości mają zastosowanie, więc nie można (ani nie należy) używać Uri do reprezentowania pliku o rozmiarze 10 GB.

Typ zmiany przełamującej

Ta zmiana jest zmianą behawioralną.

Przyczyna zmiany

Większość serwerów HTTP wymusza ścisłe ograniczenia długości adresów URL, które są skłonne do akceptowania w żądaniach. Limity są na ogół znacznie niższe niż Uripoprzednie limity. Jednak ponieważ Uri jest de facto typem wymiany na platformie .NET dla informacji przypominających identyfikator URI, poprzednie limity ograniczały jego użycie w niektórych scenariuszach bez dobrych obejść oprócz usuwania użycia w ramach kontraktów interfejsu Uri API.

Główne scenariusze dla dużych Uri rozmiarów to:

  • data: uris, które zawierają dowolne binarne obiekty blob zakodowane w base64. Mogą one być przesyłane poza wierszem żądania HTTP. Na przykład mogą one być częścią treści żądania i dlatego mogą być dowolnie duże. Uri Można teraz użyć do reprezentowania identyfikatorów URI danych zawierających większe pliki.
  • Duże ciągi zapytań. Uri jest często używany jako typ wymiany między systemami, nawet jeśli nigdy nie zostanie wysłany w ramach żądania HTTP. Informacje o żądaniach użytkownika są często kodowane w ramach ciągu zapytania, dlatego nowe zachowanie umożliwia takie scenariusze nawet w miarę wzrostu ilości danych.

W przypadku większości użytkowników nie jest wymagana żadna akcja.

Jeśli polegasz na Uri nałożeniu ograniczeń długości w ramach weryfikacji danych wejściowych, musisz teraz wykonać samodzielne sprawdzanie długości, najlepiej jako krok przed utworzeniem Uri wystąpienia. Ponieważ w praktyce większość serwerów HTTP wymusza znacznie bardziej rygorystyczne limity długości, bardzo długie dane wejściowe prawdopodobnie spowodują błędy podczas wysyłania w ramach żądania HTTP. Może się okazać, że twój scenariusz skorzysta z przeprowadzania nawet ostrzejszej weryfikacji długości niż Uri wcześniej.

Interfejsy API, których dotyczy problem