Konstrukce URL z base a relative URI

Tomáš Holan       15.01.2013       ASP.NET/IIS       11060 zobrazení

Velmi často se setkáme s případem, kdy máme base URI, typicky URL webové aplikace, a nějaké relativní URL a chceme vytvořit absolutní URL na nějakou stránku, soubor, volání webové služby apod. na této aplikaci.

Například adresa aplikace bude:

http://localhost/WebApplication

A my budeme chtít vytvořit toto URL:

http://localhost/WebApplication/help/index

Problém asi mít nebudeme pokud se bude jednat přímo o odkaz uvnitř naší aplikace, tato aplikace bude v ASP.NET nebo v ní budeme například používat Routing module a pro cílovou adresu budeme mít zavedenou routu. V obecném případě, kdy nelze využít podobnou existující infrastrukturu nebo chceme generovat link na externí aplikaci či webovou službu, tomu tak ale již být nemusí.

Problém je totiž v tom, že nemůžeme jednoduše použit konstruktor třídy Uri, to bychom dostali toto:

Uri baseUri = new Uri("http://localhost/WebApplication");
Uri url = new Uri(baseUri, "help/index");
http://localhost/help/index

Toto by šlo použít pouze v případě, že by baseUri přímo odpovídalo adrese web site (například http://www.contoso.com). Je ale dobré tohoto faktu v kódu nevyužívat a mít kód připravený obecně. Ať už jen z důvodu testování (odkaz na testovací službu místo reálné) nebo nezávislosti na konkrétním způsobu hostování naší aplikace (nasazení jako web site vs. virtuál directory).

Použitý konstruktor třídy Uri totiž zaměňuje poslední segment cesty původního URL. Existuje “trik”,  že baseUri bude končit znakem “/”:

Uri baseUri = new Uri("http://localhost/WebApplication/");
Uri url = new Uri(baseUri, "help/index");
http://localhost/WebApplication/help/index

Napsal jsem proto pomocnou třídu, která toto zajišťuje. Tato třída je k dispozici zde.

Třída UriHelper má pouze metodu GetUri (varianty Uri-Uri, Uri-string a string-string) a dále ošetřuje “uříznutí” případných znaků “/” nebo znaku “~” (relativní URL v ASP.NET) na začátku druhého parametru path. Také funguje, že pokud je v druhém argumentu absolutní URI, je přímo vrácena jeho hodnota.

Použití třídy UriHelper je velmi jednoduché:

Uri baseUri = new Uri("http://localhost/WebApplication");

Uri url1 = UriHelper.GetUri(baseUri, "help/index");
Uri url2 = UriHelper.GetUri(baseUri, "~/help/index");
Uri url3 = UriHelper.GetUri(baseUri, "/");
Uri url4 = UriHelper.GetUri(baseUri, "http://www.contoso.com/WebApplication/help/index");

Uri url5 = UriHelper.GetUri(baseUri, new Uri("help/index", UriKind.Relative));
Uri url6 = UriHelper.GetUri(baseUri, new Uri("~/help/index", UriKind.Relative));
Uri url7 = UriHelper.GetUri(baseUri, new Uri("/", UriKind.Relative));
Uri url8 = UriHelper.GetUri(baseUri, new Uri("http://www.contoso.com/WebApplication/help/index"));
http://localhost/WebApplication/help/index
http://localhost/WebApplication/help/index
http://localhost/WebApplication/
http://www.contoso.com/WebApplication/help/index

http://localhost/WebApplication/help/index
http://localhost/WebApplication/help/index
http://localhost/WebApplication/
http://www.contoso.com/WebApplication/help/index

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback