System.Uri sınıfı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

URI, intranet veya internet üzerindeki uygulamanızda kullanılabilen bir kaynağın küçük bir gösterimidir. sınıfı Uri , ayrıştırma, karşılaştırma ve birleştirme dahil olmak üzere URI'leri işlemek için özellikleri ve yöntemleri tanımlar. Sınıf Uri özellikleri salt okunur; değiştirilebilir bir nesne oluşturmak için sınıfını UriBuilder kullanın.

Göreli URI'ler (örneğin, "/new/index.htm") mutlak olmaları için temel URI'ye göre genişletilmelidir. Gerektiğinde MakeRelativeUri mutlak URI'leri göreli URI'lere dönüştürmek için yöntemi sağlanır.

Dize Uri bir düzen tanımlayıcısı da dahil olmak üzere iyi biçimlendirilmiş bir URI ise oluşturucular URI dizelerinden kaçmaz.

Özellikler Uri , 127'den büyük Unicode değerlerine sahip tüm karakterlerin onaltılık eşdeğerleriyle değiştirilip kaçış kodlamasında kurallı bir veri gösterimi döndürür. URI'yi kurallı biçimde yerleştirmek için oluşturucu Uri aşağıdaki adımları gerçekleştirir:

  • URI düzenini küçük harfe dönüştürür.

  • Konak adını küçük harfe dönüştürür.

  • Ana bilgisayar adı bir IPv6 adresiyse kurallı IPv6 adresi kullanılır. ScopeId ve diğer isteğe bağlı IPv6 verileri kaldırılır.

  • Varsayılan ve boş bağlantı noktası numaralarını kaldırır.

  • file:// düzeni olmayan örtük dosya yollarını ("C:\my\file") file:// düzeniyle açık dosya yollarına dönüştürür.

  • Ayrılmış bir amacı olmayan kaçış karakterlerinin (yüzde kodlanmış sekizli olarak da bilinir) kodu çözülebilir (ayrılmamış olarak da bilinir). Bu ayrılmamış karakterler büyük ve küçük harfleri (%41-%5A ve %61-%7A), ondalık basamakları (%30-%39), kısa çizgi (%2B), nokta (%2E), alt çizgi (%5F) ve tilde (%7E) içerir.

  • /./, /.. gibi dizileri sıkıştırarak hiyerarşik URI'ler için yolu kurallı hale ekler. /, ve // (dizinin kaçış olup olmadığı). Bu dizilerin sıkıştırılmadığı bazı şemalar olduğunu unutmayın.

  • Hiyerarşik URI'ler için, konak eğik çizgi (/) ile sonlandırılmazsa, bir tane eklenir.

  • Varsayılan olarak, URI'deki tüm ayrılmış karakterler RFC 2396'ya uygun olarak kaçıştır. Uluslararası Kaynak Tanımlayıcıları veya Uluslararası Etki Alanı Adı ayrıştırma etkinse bu davranış değişir ve bu durumda URI'deki ayrılmış karakterler RFC 3986 ve RFC 3987'ye uygun olarak kaçılır.

Bazı şemalar için oluşturucuda kurallı hale getirmenin bir parçası olarak, nokta kesimleri ve boş kesimler (/./, /../ve //) sıkıştırılır (başka bir deyişle kaldırılır). Kesimleri sıkıştıran Uri şemalar http, https, tcp, net.pipe ve net.tcp'dir. Diğer bazı düzenler için bu diziler sıkıştırılmaz. Aşağıdaki kod parçacığı, sıkıştırmanın uygulamada nasıl göründüğünü gösterir. Kaçış dizileri, gerekirse manzarasız ve sonra sıkıştırılır.

var uri = new Uri("http://myUrl/../.."); // http scheme, unescaped
OR
var uri = new Uri("http://myUrl/%2E%2E/%2E%2E"); // http scheme, escaped
OR
var uri = new Uri("ftp://myUrl/../.."); // ftp scheme, unescaped
OR
var uri = new Uri("ftp://myUrl/%2E%2E/%2E%2E"); // ftp scheme, escaped

Console.WriteLine($"AbsoluteUri: {uri.AbsoluteUri}");
Console.WriteLine($"PathAndQuery: {uri.PathAndQuery}");

Bu kod yürütürken aşağıdaki metne benzer bir çıkış döndürür.

AbsoluteUri: http://myurl/
PathAndQuery: /

yöntemini kullanarak sınıfın Uri içeriğini kaçış kodlanmış URI başvurusundan okunabilir bir URI başvurusuna ToString dönüştürebilirsiniz. Bazı ayrılmış karakterlerin yine de yöntemin çıkışında ToString kaçış olabileceğini unutmayın. Bu, tarafından döndürülen değerden bir URI'nin kesin olarak yeniden yapılandırılmasını desteklemektir ToString.

Bazı URI'ler parça tanımlayıcısı, sorgu veya her ikisini de içerir. Parça tanımlayıcısı, sayı işaretini (#) izleyen herhangi bir metindir; sayı işareti dahil değildir; parça metni özelliğinde Fragment depolanır. Sorgu bilgileri, URI'de soru işaretini (?) izleyen herhangi bir metindir; sorgu metni özelliğinde Query depolanır.

Not

URI sınıfı, IP adreslerinin hem IPv4 protokolü için dörtlü gösteriminde hem de IPv6 protokolü için iki nokta üst üste onaltılık olarak kullanılmasını destekler. http://[::1] gibi IPv6 adresini köşeli ayraç içine almayı unutmayın.

Uluslararası kaynak tanımlayıcı desteği

Web adresleri genellikle çok kısıtlı bir karakter kümesinden oluşan tekdüzen kaynak tanımlayıcıları kullanılarak ifade edilir:

  • İngiliz alfabesinden büyük ve küçük harf ASCII harfleri.
  • 0 ile 9 basamakları.
  • Az sayıda diğer ASCII simgesi.

URI'ler için belirtimler, İnternet Mühendisliği Görev Gücü (IETF) tarafından yayımlanan RFC 2396, RFC 2732, RFC 3986 ve RFC 3987'de belgelenmiştir.

İngilizce dışındaki dilleri kullanarak kaynakları tanımlama gereksinimini kolaylaştıran ve ASCII olmayan karakterlere (Unicode/ISO 10646 karakter kümesindeki karakterler) izin veren tanımlayıcılar Uluslararası Kaynak Tanımlayıcıları (IRI) olarak bilinir. IPI'ler için belirtimler, IETF tarafından yayımlanan RFC 3987'de belgelenmiştir. IPI'leri kullanmak, URL'nin Unicode karakterleri içermesine olanak tanır.

.NET Framework 4.5 ve sonraki sürümlerinde IRI her zaman etkindir ve yapılandırma seçeneği kullanılarak değiştirilemez. Etki alanı adına Uluslararası Etki Alanı Adı (IDN) ayrıştırmasının uygulanmasını isteyip istemediğinizi belirtmek için machine.config dosyasında veya app.config dosyasında bir yapılandırma seçeneği ayarlayabilirsiniz. Örneğin:

<configuration>
  <uri>
    <idn enabled="All" />
  </uri>
</configuration>

IDN'nin etkinleştirilmesi, bir etki alanı adındaki tüm Unicode etiketlerini Punycode eşdeğerlerine dönüştürür. Punycode adları yalnızca ASCII karakterleri içerir ve her zaman xn-- ön eki ile başlar. Bunun nedeni, çoğu DNS sunucusu yalnızca ASCII karakterlerini desteklediğinden İnternet'te mevcut DNS sunucularını desteklemektir (bkz. RFC 3940).

IDN'nin etkinleştirilmesi özelliğin Uri.DnsSafeHost değerini etkiler. IDN'nin etkinleştirilmesi , , OriginalStringGetComponentsve IsWellFormedOriginalString yöntemlerinin Equalsdavranışını da değiştirebilir.

Kullanılan DNS sunucularına bağlı olarak IDN için üç olası değer vardır:

  • idn enabled = Tümü

    Bu değer, tüm Unicode etki alanı adlarını Punycode eşdeğerlerine (IDN adları) dönüştürür.

  • idn enabled = AllExceptIntranet

    Bu değer, yerel Intranet'te bulunmayan tüm Unicode etki alanı adlarını Punycode eşdeğerlerini (IDN adları) kullanacak şekilde dönüştürür. Bu durumda, yerel Intranet'teki uluslararası adları işlemek için Intranet için kullanılan DNS sunucuları Unicode ad çözümlemesini desteklemelidir.

  • idn enabled = None

    Bu değer, Herhangi bir Unicode etki alanı adını Punycode kullanacak şekilde dönüştürmez. Bu varsayılan değerdir.

Normalleştirme ve karakter denetimi RFC 3986 ve RFC 3987'deki en son IRI kurallarına göre yapılır.

Sınıfında IRI ve IDN işlemeUri, , System.Configuration.IdnElementve System.Configuration.UriSection yapılandırma ayarı sınıfları kullanılarak System.Configuration.IriParsingElementda denetlenebilir. ayarı System.Configuration.IriParsingElement , sınıfında IRI işlemeyi Uri etkinleştirir veya devre dışı bırakır. ayarı, System.Configuration.IdnElement sınıfında IDN işlemeyi Uri etkinleştirir veya devre dışı bırakır.

ve için System.Configuration.IriParsingElementSystem.Configuration.IdnElement yapılandırma ayarı, ilk System.Uri sınıf oluşturulduğunda bir kez okunur. Bu süreden sonra yapılandırma ayarlarında yapılan değişiklikler yoksayılır.

Sınıf System.GenericUriParser ayrıca IRI ve IDN'yi destekleyen özelleştirilebilir bir ayrıştırıcı oluşturmaya izin verecek şekilde genişletilmiştir. Bir System.GenericUriParser nesnenin davranışı, numaralandırmada System.GenericUriParserOptions bulunan değerlerin bit düzeyinde bir bileşimi oluşturucuya System.GenericUriParser geçirilerek belirtilir. Türü GenericUriParserOptions.IriParsing , ayrıştırıcının Uluslararası Kaynak Tanımlayıcıları (IRI) için RFC 3987'de belirtilen ayrıştırma kurallarını desteklediğini gösterir.

türü GenericUriParserOptions.Idn , ayrıştırıcının ana bilgisayar adlarının Uluslararası Etki Alanı Adı (IDN) ayrıştırma işlemini desteklediğini gösterir. .NET 5 ve sonraki sürümlerde (.NET Core dahil) ve .NET Framework 4.5+ sürümlerinde IDN her zaman kullanılır. Önceki sürümlerde bir yapılandırma seçeneği, IDN'nin kullanılıp kullanılmadığını belirler.

Örtük dosya yolu desteği

Uri yerel dosya sistemi yollarını temsil etmek için de kullanılabilir. Bu yollar, file:// düzeniyle başlayan URI'lerde ve örtük olarak file:// şemasına sahip olmayan URI'lerde gösterilebilir. Somut bir örnek olarak, aşağıdaki iki URI'nin her ikisi de geçerli ve aynı dosya yolunu temsil ediyor:

Uri uri1 = new Uri("C:/test/path/file.txt") // Implicit file path.
Uri uri2 = new Uri("file:///C:/test/path/file.txt") // Explicit file path.

Bu örtük dosya yolları URI belirtimi ile uyumlu değildir ve mümkün olduğunda bundan kaçınılmalıdır. Unix tabanlı sistemlerde .NET Core kullanılırken, mutlak örtük bir dosya yolu göreli bir yoldan ayırt edilemez olduğundan örtük dosya yolları özellikle sorunlu olabilir. Böyle bir belirsizlik olduğunda, Uri varsayılan olarak yolu mutlak bir URI olarak yorumlamaktır.

Güvenlik konuları

Güvenlik endişeleri nedeniyle uygulamanız güvenilmeyen kaynaklardan örnekleri kabul ederken Uri ve dontEscape oluşturucuda olarak ayarlanırken true dikkatli olmalıdır. yöntemini çağırarak bir URI dizesinin IsWellFormedOriginalString geçerliliğini de kontrol edebilirsiniz.

Güvenilmeyen kullanıcı girişiyle ilgilenirken, özelliklerine güvenmeden önce yeni oluşturulan Uri örnekle ilgili varsayımları onaylayın. Bu, aşağıdaki şekilde yapılabilir:

string userInput = ...;

Uri baseUri = new Uri("https://myWebsite/files/");

if (!Uri.TryCreate(baseUri, userInput, out Uri newUri))
{
    // Fail: invalid input.
}

if (!baseUri.IsBaseOf(newUri))
{
    // Fail: the Uri base has been modified - the created Uri is not rooted in the original directory.
}

Bu doğrulama, UNC yollarıyla ilgilenirken olduğu gibi diğer durumlarda yalnızca öğesini değiştirerek baseUrikullanılabilir:

Uri baseUri = new Uri(@"\\host\share\some\directory\name\");

Performans değerlendirmeleri

Uygulamanızı başlatmak için URI'leri içeren bir Web.configdosyası kullanırsanız, düzen tanımlayıcıları standart değilse URI'leri işlemek için ek süre gerekir. Böyle bir durumda, başlangıç zamanında değil, URI'ler gerektiğinde uygulamanızın etkilenen bölümlerini başlatın.