Alternatives to .NET provided apis regarding uris

2019-06-28 03:14发布

问题:

I've recently come to the realization that the .NET apis working with URLs and URIs frequently come up short in achieving even basic functionality (atleast easily) including things such as: generating a FQDN url from a relative path, forcing https or back to http, getting the root of the site, combining relative urls properly and so forth.

Are there any alternative libraries out there that have put all of these type of functionality in a simple and reliable project?

回答1:

XUri is a nice class that is part of the open source project from MindTouch

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

This article includes a quick sample on how to use it.

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

I am a fan of it. A little overkill assembly wise if you are going to just use the XUri portion, but there are other really nice things in the library too.



回答2:

I've certainly found myself doing much the same URI-manipulation code more than once, in .NET, but I don't see your cases as places it lacks.

Full URI from relative Uri:

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

Obtaining the actual FQDN:

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

Forcing https or back to 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;

Getting the root of the site:

new Uri(startingUri, "/");

Combining relative urls properly:

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

Only two of these are more than a single method call, and of those obtaining the FQDN is pretty obscure (unless rather than wanting the dot-ended FQDN you just wanted the absolute URI, in which case we're back to a single method call).

There is a single method version of the HTTPS/HTTP switching, though it's actually more cumbersome since it calls several properties of the Uri object. I can live with it taking a few lines to do this switch.

Still, to provide a new API one need only supply:

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

I really can't see how an API could possibly be any more concise in the other cases.



回答3:

I use a combination of extensions with 'System.IO.Path' object as well.

These are just blurbs for example.

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


标签: c# .net url