web-dev-qa-db-fra.com

Base Uri sans barre oblique

Si je crée une Uri en utilisant la UriBuilder comme ceci:

var rootUrl = new UriBuilder("http", "example.com", 50000).Uri;

alors la AbsoluteUri de rootUrl contient toujours une barre oblique de fin comme celle-ci:

http://example.com:50000/

Ce que j'aimerais, c'est créer un objet Uri sans la barre oblique finale, mais cela semble impossible.

Ma solution consiste à le stocker sous forme de chaîne et à faire quelque chose de moche comme celui-ci:

var rootUrl = new UriBuilder("http", "example.com", 50000).Uri.ToString().TrimEnd('/');

J'ai entendu des gens dire que sans la barre oblique finale, l'Uri est invalide. Je ne pense pas que ce soit vrai. J'ai examiné la RFC 3986 et la section 3.2.2 indique:

Si un URI contient un composant d'autorité, le composant de chemin d'accès Doit être vide ou commencer par une barre oblique ("/").

Il ne dit pas que le slash final doit être là.

8
4thex

Le slash de fin n’est pas required dans un URI arbitraire, mais c’est la partie du canonical représentation d’un URI absolu pour les requêtes dans HTTP

Notez que le chemin absolu ne peut pas être vide; si aucun n'est présent dans l'URI d'origine, il DOIT être indiqué par "/" (la racine du serveur).

Pour adhérer à à la spécification , la classe Uri génère un URI sous la forme avec une barre oblique finale: 

En général, un URI qui utilise la syntaxe générique pour une autorité avec un chemin vide doit être normalisé en un chemin "/".

Ce comportement n'est pas configurable sur un objet Uri dans .NET. Les navigateurs Web et de nombreux clients HTTP procèdent de la même manière lors de l’envoi de demandes d’URL avec un chemin vide.

Si nous voulons représenter notre URL en interne sous la forme d'un objet Uri, et non d'une chaîne, nous pouvons créer une méthode extension qui formate l'URL sans la barre oblique finale, ce qui permet d'abréger cette logique de présentation à un endroit au lieu de la dupliquer à chaque fois nous devons sortir l'URL pour l'affichage:

namespace Example.App.CustomExtensions 
{
    public static class UriExtensions 
    {
        public static string ToRootHttpUriString(this Uri uri) 
        {
            if (!uri.IsHttp()) 
            {
                throw new InvalidOperationException(...);
            }

            return uri.Scheme + "://" + uri.Authority;
        }

        public static bool IsHttp(this Uri uri) 
        {
            return uri.Scheme == "http" || uri.Scheme == "https";
        }
    }
}

Ensuite: 

using Example.App.CustomExtensions;
...

var rootUrl = new UriBuilder("http", "example.com", 50000).Uri; 
Console.WriteLine(rootUrl.ToRootHttpUriString()); // "http://example.com:50000"
4
Cy Rossignol

Vous pouvez utiliser la méthode Uri.GetComponents:

rootUrl.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped)

Ce qui renverrait une représentation string des différents composants de Uri, dans ce cas, UriComponents.SchemeAndServer désigne les composants scheme , Host et port .

Vous pouvez en savoir plus sur MSDN:

  1. Uri.GetComponents

  2. UriComponents

  3. UriFormat

0
eitamal