4 votes

Alternatives aux apis fournies par .NET concernant les uris et les urls

Je me suis récemment rendu compte que les apis .NET qui travaillent avec les URL et les URI ne parviennent pas toujours à réaliser les fonctionnalités de base (du moins facilement), notamment : générer une url FQDN à partir d'un chemin relatif, forcer https ou revenir à http, obtenir la racine du site, combiner correctement les urls relatives, etc.

Existe-t-il des bibliothèques alternatives qui ont intégré toutes ces fonctionnalités dans un projet simple et fiable ?

11voto

Jon Hanna Points 40291

Je me suis certainement retrouvé à faire plus d'une fois le même code de manipulation d'URI, en .NET, mais je ne vois pas dans vos cas des endroits où cela fait défaut.

URI complet à partir de l'Uri relatif :

new Uri(base, relative) // (works whether relative is a string or a Uri).

Obtention du FQDN réel :

string host = uri.Host;
string fqdn = hostEndsWith(".") ? host : host + ".";

Forcer https ou revenir à 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;

Obtenir la racine du site :

new Uri(startingUri, "/");

Combiner correctement les urls relatives :

new Uri(baseUri, relUri); // We had this one already.

Seuls deux d'entre eux sont plus qu'un simple appel de méthode, et parmi ceux-ci, l'obtention du FQDN est plutôt obscure (à moins que, au lieu de vouloir le FQDN à points, vous vouliez simplement l'URI absolu, auquel cas nous en revenons à un simple appel de méthode).

Il existe une version à méthode unique de la commutation HTTPS/HTTP, bien qu'elle soit en fait plus lourde puisqu'elle appelle plusieurs propriétés de l'objet Uri. Je peux vivre avec le fait que cela prenne quelques lignes pour faire ce changement.

Pourtant, pour fournir une nouvelle API, il suffit de la fournir :

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;
}

Je ne vois vraiment pas comment une API pourrait être plus concise dans les autres cas.

4voto

Brad Cunningham Points 3835

XUri est une classe agréable qui fait partie du projet open source de MindTouch.

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

Cet article présente un exemple rapide de la façon de l'utiliser.

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

J'en suis fan. C'est un peu surchargé en termes d'assemblage si vous n'utilisez que la partie XUri, mais il y a d'autres choses très intéressantes dans cette bibliothèque.

2voto

BlackjacketMack Points 1057

J'utilise également une combinaison d'extensions avec l'objet 'System.IO.Path'.

Ce ne sont que des extraits, à titre d'exemple.

 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);
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X