Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megjegyzés:
Ez a cikk kiegészítő megjegyzéseket tartalmaz az API referenciadokumentációjához.
Az egységes erőforrás-azonosító (URI) az alkalmazás számára az intraneten vagy az interneten elérhető erőforrások kompakt ábrázolása. Az Uri osztály meghatározza az URI-k kezelésének tulajdonságait és módszereit, beleértve az elemzést, az összehasonlítást és az egyesítést. Az Uri osztály tulajdonságai írásvédettek; ha módosítható objektumot szeretne létrehozni, használja a UriBuilder osztályt.
A relatív URI-kat (például a "/new/index.htm") az alap URI-k tekintetében ki kell bővíteni, hogy abszolútak legyenek. A MakeRelativeUri módszer az abszolút URI-k relatív URI-kká való konvertálására szolgál, ha szükséges.
A Uri konstruktorok nem menekülnek az URI-sztringek elől, ha a sztring egy jól formázott URI, beleértve a sémaazonosítót is.
A Uri tulajdonságok egy kanonikus adatábrázolást adnak vissza escaped kódolásban, ahol az összes 127-nél nagyobb Unicode-értékkel rendelkező karakter a hexadecimális megfelelőjével van helyettesítve. Az URI kanonikus formába hozásához a Uri konstruktor a következő lépéseket hajtja végre:
- Az URI-sémát kisbetűssé alakítja.
- Átalakítja a hosztnév minden betűjét kisbetűssé.
- Ha a gazdagép neve IPv6-cím, a kanonikus IPv6-címet használja. A ScopeId és más opcionális IPv6-adatok törlődnek.
- Eltávolítja az alapértelmezett és üres portszámokat.
- Implicit fájlelérési utakat konvertál a file:// séma nélkül (például "C:\my\file") explicit fájlelérési utakká a file:// sémával.
- A nem fenntartott célokkal nem rendelkező (más néven százalékkódolt oktett) karaktereket a rendszer dekódolja (más néven le nem ágyazott karaktereket). Ezek a nem foglalt karakterek közé tartoznak a nagybetűk és a kisbetűk (%41-%5A és %61-%7A), decimális számjegyek (%30-%39), kötőjel (%2D), pont (%2E), aláhúzás (%5F) és tilde (%7E).
- A hierarchikus URI-k elérési útját canonicalizálja az olyan szekvenciák tömörítésével, mint például
/./és/../(függetlenül attól, hogy a sorozat meg van-e szökve). Vegye figyelembe, hogy vannak olyan sémák, amelyek esetében ezek a sorozatok nincsenek tömörítve. - Hierarchikus URI-k esetén, ha a gazdagép nem perjellel (/) végződik, akkor a rendszer hozzáad egy elemet.
- Alapértelmezés szerint az URI-ban lévő fenntartott karakterek az RFC 2396-nak megfelelően vannak feloldva. Ez a viselkedés akkor változik, ha a nemzetközi erőforrás-azonosítók vagy a nemzetközi tartománynév-elemzés engedélyezve van, ebben az esetben az URI fenntartott karakterei az RFC 3986 és az RFC 3987 szerint vannak feloldva.
Egyes sémák konstruktorában a canonicalization részeként a pontszegmensek (/./ és /../) tömörítve vannak (vagyis el lesznek távolítva). A Uri által tömörített szegmensek protokolljai közé tartozik a http, a https, a tcp, a net.pipe és a net.tcp. Más sémák esetében ezek a sorozatok nem tömöríthetők. Az alábbi kódrészlet bemutatja, hogyan néz ki a tömörítés a gyakorlatban. A szökött szekvenciák szükség esetén nem lesznek lezárva, majd tömörítve.
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}");
A kód végrehajtásakor a következő szöveghez hasonló kimenetet ad vissza.
AbsoluteUri: http://myurl/
PathAndQuery: /
A metódussal Uri átalakíthatja az ToString osztály tartalmát egy feloldó kódolt URI-hivatkozásból egy olvasható URI-hivatkozásra. Vegye figyelembe, hogy a metódus kimenetében ToString néhány fenntartott karakter továbbra is megmenekülhet. Ennek célja, hogy támogassa az URI egyértelmű rekonstrukcióját a visszaadott ToStringértékből.
Egyes URI-k tartalmazhatnak töredékazonosítót, lekérdezést vagy mindkettőt. A töredékazonosítók olyan szövegek, amelyek számjelet (#) követnek, a számjelet nem beleértve; a töredékszöveget a Fragment tulajdonság tárolja. A lekérdezési információk olyan szövegek, amelyek az URI-ban egy kérdőjelet (?) követnek; a lekérdezés szövegét a Query tulajdonság tárolja.
Megjegyzés:
Az URI osztály támogatja az IP-címek használatát mind az IPv4 protokoll, mind a kettőspont-hexadecimális IPv6 protokoll esetében. Ne felejtse el szögletes zárójelbe tenni az IPv6-címet, mint http://[::1].
Nemzetközi erőforrás-azonosító támogatása
A webcímek általában olyan URI-k használatával vannak kifejezve, amelyek nagyon korlátozott karakterekből állnak:
- Kis- és nagybetűs ASCII-betűk az angol ábécéből.
- Számjegyek 0 és 9 között.
- Néhány egyéb ASCII-szimbólum.
Az URI-k specifikációit az Internet Engineering Task Force (IETF) által közzétett RFC 2396, RFC 2732, RFC 3986 és RFC 3987 tartalmazza.
Azokat az azonosítókat, amelyek megkönnyítik az erőforrások azonosítását az angoltól eltérő nyelvekkel, és lehetővé teszik a nem ASCII-karaktereket (a Unicode/ISO 10646 karakterkészletben szereplő karaktereket) nemzetközi erőforrás-azonosítóknak (IRI-k) nevezzük. Az IRI-k specifikációit az IETF által közzétett RFC 3987 tartalmazza. Az IRI-k használatával az URL-címek Unicode-karaktereket tartalmazhatnak.
A .NET-keretrendszer 4.5-ös és újabb verzióiban az IRI mindig engedélyezve van, és konfigurációs beállítással nem módosítható. A machine.config vagy a app.config fájlban megadhatja, hogy a tartománynévre nemzetköziesített tartománynév (IDN) elemzést szeretne-e alkalmazni. Például:
<configuration>
<uri>
<idn enabled="All" />
</uri>
</configuration>
Az IDN engedélyezése a tartománynévben lévő összes Unicode-címkét a Punycode-megfelelőjükké alakítja. A punycode nevek csak ASCII karaktereket tartalmaznak, és mindig az xn előtaggal kezdődnek. Ennek az az oka, hogy támogatja a meglévő DNS-kiszolgálókat az interneten, mivel a legtöbb DNS-kiszolgáló csak ASCII-karaktereket támogat (lásd: RFC 3940).
Az IDN engedélyezése hatással van a Uri.DnsSafeHost tulajdonság értékére. Az IDN engedélyezése megváltoztathatja a Equals, OriginalString, GetComponents és IsWellFormedOriginalString metódusok viselkedését.
Az IDN-nek három lehetséges értéke van a használt DNS-kiszolgálóktól függően:
idn engedélyezve = Mind
Bármilyen Unicode-tartománynevet átalakít a Punycode-megfelelőivé (IDN-nevekké).
idn enabled egyenlő AllExceptIntranet
A helyi intraneten nem szereplő Unicode-tartománynevek konvertálása a Punycode-megfelelők (IDN-nevek) használatára. Ebben az esetben a helyi intraneten lévő nemzetközi nevek kezeléséhez az intranethez használt DNS-kiszolgálóknak támogatniuk kell a Unicode-névfeloldásokat.
Az idn engedélyezve = None
A Rendszer nem konvertálja Unicode-tartományneveket a Punycode használatára. Ez az alapértelmezett érték.
A normalizálás és a karakterellenőrzés az RFC 3986 és az RFC 3987 legújabb IRI-szabályainak megfelelően történik.
Az IRI- és IDN-feldolgozást a Uri osztályban a System.Configuration.IriParsingElement, System.Configuration.IdnElement és System.Configuration.UriSection konfigurációs beállításosztályokkal is szabályozhatja. A System.Configuration.IriParsingElement beállítás engedélyezi vagy letiltja az IRI-feldolgozást az Uri osztályban. A System.Configuration.IdnElement beállítás engedélyezi vagy letiltja az idn-feldolgozást az Uri osztályban.
A System.Configuration.IriParsingElement és System.Configuration.IdnElement konfigurációs beállításait egyszer olvassák be, amikor az első System.Uri osztály létrejön. A rendszer figyelmen kívül hagyja a konfigurációs beállítások módosításait.
Az System.GenericUriParser osztályt ki is bővítették, hogy az IRI-t és az IDN-t támogató testre szabható elemzőt hozzon létre. A System.GenericUriParser objektum viselkedését úgy határozhatja meg, hogy a System.GenericUriParserOptions felsorolásban elérhető értékek bitenkénti kombinációját adja át a System.GenericUriParser konstruktornak. A GenericUriParserOptions.IriParsing típus azt jelzi, hogy az elemző támogatja a nemzetközi erőforrás-azonosítókhoz (IRI) tartozó RFC 3987-ben meghatározott elemzési szabályokat.
A GenericUriParserOptions.Idn típus azt jelzi, hogy az elemző támogatja a gazdagépnevek nemzetköziesített tartományneveinek (IDN) elemzését. A .NET 5-ös és újabb verzióiban (beleértve a .NET Core-t) és a .NET Framework 4.5+-ot, az IDN-t mindig használja a rendszer. A korábbi verziókban egy konfigurációs beállítás határozza meg, hogy az IDN van-e használva.
Implicit fájlelérési út támogatása
Uri a helyi fájlrendszer elérési útjainak ábrázolására is használható. Ezek az útvonalak explicit módon ábrázolhatók az file:// sémával kezdődő URI-kban, és implicit módon azokban az URI-kban, amelyek nem rendelkeznek a file:// sémával. Konkrét példaként az alábbi két URI érvényes, és ugyanazt a fájl elérési útját jelöli:
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.
Ezek az implicit fájlelérési utak nem felelnek meg az URI-specifikációnak, ezért lehetőség szerint kerülni kell őket. A .NET Core Unix-alapú rendszereken való használatakor az implicit fájlelérési útvonalak különösen problémásak lehetnek, mivel egy abszolút implicit fájl elérési útja nem megkülönböztethető egy relatív elérési úttól. Ilyen kétértelműség Uri esetén alapértelmezés szerint az elérési utat abszolút URI-ként kell értelmezni.
Biztonsági szempontok
Biztonsági problémák miatt az alkalmazásnak körültekintően kell eljárnia, amikor Uri példányokat fogad el nem megbízható forrásokból, különösen, ha a dontEscape a true van beállítva értékre. A metódus meghívásával ellenőrizheti az URI-sztring érvényességét IsWellFormedOriginalString .
A nem megbízható felhasználói bemenetek kezelésekor erősítse meg az újonnan létrehozott Uri példányra vonatkozó feltételezéseket, mielőtt megbízik a tulajdonságaiban.
Ez a következő módon végezhető el:
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.
}
Ez az ellenőrzés más esetekben is használható, például az UNC-útvonalak kezelésekor a következő egyszerű módosításával baseUri:
Uri baseUri = new Uri(@"\\host\share\some\directory\name\");
A tervezéssel és a biztonsági szempontokkal UriUriBuilderkapcsolatos további részletekért tekintse át a következő fenyegetésmodell-dokumentumokat:
Teljesítménnyel kapcsolatos szempontok
Ha olyanWeb.config fájlt használ, amely URI-kat tartalmaz az alkalmazás inicializálásához, további időre van szükség az URI-k feldolgozásához, ha a sémaazonosítók nem megfelelőek. Ilyen esetben inicializálja az alkalmazás érintett részeit, amikor az URI-kra van szükség, ne a kezdési időpontban.