Condividi tramite


Uri limiti di lunghezza rimossi

I metodi che creano Uri istanze (costruttori e TryCreate metodi factory) hanno storicamente limitato la lunghezza della stringa URI a circa 65.000 caratteri (i limiti esatti variavano leggermente a seconda del formato di input). Questi limiti sono stati revocati in modo che non vi sia praticamente alcun limite superiore sulla durata Uri delle istanze.

Versione introdotta

.NET 10

Comportamento precedente

In precedenza, non era possibile creare un'istanza Uri la cui lunghezza superava circa 65.000 caratteri. Il codice simile all'esempio seguente ha generato un UriFormatException oggetto con il messaggio "URI non valido: la stringa URI è troppo lunga".

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

Nuovo comportamento

A partire da .NET 10, Uri è ora possibile creare istanze contenenti grandi quantità di dati. Per esempio:

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

Le restrizioni rimosse si applicano principalmente a percorsi, query e frammenti come componenti più pratici per trasportare grandi quantità di dati. I componenti, ad esempio lo schema e l'host, potrebbero comunque imporre alcuni limiti di lunghezza. Le limitazioni pratiche quando si avvicinano anche i limiti di lunghezza di string si applicano, quindi non è possibile (né è necessario) usare Uri per rappresentare un file da 10 GB.

Tipo di cambiamento che interrompe la compatibilità

Questa modifica è una modifica funzionale.

Motivo della modifica

La maggior parte dei server HTTP applica restrizioni di lunghezza rigorosa agli URL che sono disposti ad accettare nelle richieste. I limiti sono in genere molto inferiori ai Urilimiti precedenti. Tuttavia, poiché Uri è il tipo di scambio de facto in .NET per informazioni simili a URI, i limiti precedenti limitano l'uso in alcuni scenari senza soluzioni alternative valide oltre a rimuovere l'uso di Uri in tutti i contratti API.

Gli scenari principali per grandi dimensioni Uri sono:

  • data: uri, che contengono BLOB binari arbitrari codificati in Base64. Questi dati potrebbero essere trasmessi all'esterno della riga di richiesta HTTP. Ad esempio, potrebbero far parte del corpo della richiesta e pertanto possono essere arbitrariamente grandi. Uri può ora essere usato per rappresentare gli URI di dati contenenti file di dimensioni maggiori.
  • Stringhe di query di grandi dimensioni. Uri viene spesso usato come tipo di scambio tra sistemi anche se non verrà mai inviato come parte di una richiesta HTTP. Le informazioni sulle richieste utente vengono spesso codificate come parte della stringa di query, quindi il nuovo comportamento consente tali scenari anche quando aumenta la quantità di dati.

Per la maggior parte degli utenti, non è necessaria alcuna azione.

Se si fa affidamento su Uri per imporre restrizioni di lunghezza come parte della convalida dell'input, è ora necessario eseguire il controllo della lunghezza manualmente, preferibilmente come passaggio prima di costruire l'istanza Uri . Poiché la maggior parte dei server HTTP applica limiti di lunghezza molto più rigorosi in pratica, gli input molto lunghi hanno già generato errori quando vengono inviati come parte di una richiesta HTTP. Si potrebbe notare che lo scenario potrebbe trarre vantaggio dall'esecuzione di una convalida di lunghezza ancora più rigorosa rispetto Uri a quella eseguita in precedenza.

Le API interessate