Альтернативы .NET предоставили API в отношении Uris и URL - PullRequest
4 голосов
/ 19 августа 2010

Я недавно пришел к выводу, что API .NET, работающие с URL-адресами и URI, часто не справляются даже с базовыми функциями (по крайней мере, легко), включая такие вещи, как: создание URL-адреса FQDN по относительному пути, форсирование https или вернитесь к http, чтобы получить корень сайта, правильно комбинировать относительные URL и т. д.

Существуют ли какие-либо альтернативные библиотеки, которые поместили бы все эти функции в простой и надежный проект?

Ответы [ 3 ]

11 голосов
/ 23 августа 2010

Я, конечно, обнаружил, что много раз повторяю один и тот же код манипуляции с 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 может быть более кратким в других случаях.

4 голосов
/ 28 августа 2010

XUri - хороший класс, который является частью проекта с открытым исходным кодом от MindTouch

http://developer.mindtouch.com/en/ref/dream/MindTouch.Dream/XUri?highlight=XUri

Эта статья содержит краткий пример того, как его использовать.

http://blog.developer.mindtouch.com/2009/05/18/consuming-rest-services-and-tdd-with-plug/

Я фанат этого. Немного излишней сборки, если вы собираетесь использовать только часть XUri, но в библиотеке есть и другие действительно хорошие вещи.

2 голосов
/ 27 августа 2010

Я также использую комбинацию расширений с объектом System.IO.Path.

Это просто размытие, например.

 public static Uri SecureIfRemote(this Uri uri){



if(!System.Web.HttpContext.Current.Request.IsSecureConnection &&
                !System.Web.HttpContext.Current.Request.IsLocal){
return new Uri......(build secure uri here)
}

return uri;

    }

public static NameValueCollection ParseQueryString(Uri uri){
return uri.Query.ParseQueryString();
}


    public static NameValueCollection ParseQueryString(this string s)
    {
        //return
        return HttpUtility.ParseQueryString(s);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...