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