Я, конечно, обнаружил, что много раз повторяю один и тот же код манипуляции с URI в .NET, но я не рассматриваю ваши случаи как места, которых ему не хватает.
Полный URI от относительного URI:
new Uri(base, relative) // (works whether relative is a string or a Uri).
Получение фактического полного доменного имени:
string host = uri.Host;
string fqdn = hostEndsWith(".") ? host : host + ".";
Принудительный https или обратно на http:
UriBuilder toHttp = new UriBuilder(someUri);
toHttp.Scheme = "http";
toHttp.Port = 80;
return toHttp.Uri;
UriBuilder toHttps = new UriBuilder(someUri);
toHttps.Scheme = "https";
toHttps.Port = 443;
return toHttps.Uri;
Получение рута сайта:
new Uri(startingUri, "/");
Правильное объединение относительных URL:
new Uri(baseUri, relUri); // We had this one already.
Только два из них - это больше, чем один вызов метода, и из тех, кто получает полное доменное имя, довольно неясно (если вместо того, чтобы получить полное доменное имя с точечным окончанием, вам нужен только абсолютный URI, и в этом случае мы возвращаемся к одиночный вызов метода).
Существует одна версия метода переключения HTTPS / HTTP, хотя на самом деле она более громоздкая, так как вызывает несколько свойств объекта Uri. Я могу жить с этим, занимая несколько строк, чтобы сделать это переключение.
Тем не менее, для предоставления нового API достаточно всего лишь:
public static Uri SetHttpPrivacy(this Uri uri, bool privacy)
{
UriBuilder ub = new UriBuilder(uri);
if(privacy)
{
ub.Scheme = "https";
ub.Port = 443;
}
else
{
ub.Scheme = "http";
ub.Port = 80;
}
return ub.Uri;
}
Я действительно не понимаю, как API может быть более кратким в других случаях.