Obtenir l'URL sans chaîne de requête

197

J'ai une URL comme celle-ci:

http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye

Je veux m'en sortir http://www.example.com/mypage.aspx.

Pouvez-vous me dire comment puis-je l'obtenir?

Rocky Singh
la source

Réponses:

134

Vous pouvez utiliser System.Uri

Uri url = new Uri("http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye");
string path = String.Format("{0}{1}{2}{3}", url.Scheme, 
    Uri.SchemeDelimiter, url.Authority, url.AbsolutePath);

Ou vous pouvez utiliser substring

string url = "http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye";
string path = url.Substring(0, url.IndexOf("?"));

EDIT: Modification de la première solution pour refléter la suggestion de brillyfresh dans les commentaires.

Josh
la source
6
url.AbsolutePath ne renvoie que la partie du chemin de l'URL (/mypage.aspx); ajoutez url.Scheme (http) + Uri.SchemeDelimiter (: //) + url.Authority (www.somesite.com) pour l'URL complète que vous vouliez
Ryan
22
La méthode Uri.GetLeftPart est plus simple comme mentionné stackoverflow.com/questions/1188096/…
Edward Wilde
La substringméthode donnera une erreur s'il n'y a pas de chaîne de requête. Utilisez string path = url.Substring(0, url.IndexOf("?") > 0? url.IndexOf("?") : url.Length);plutôt.
stomie
385

Voici une solution plus simple:

var uri = new Uri("http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye");
string path = uri.GetLeftPart(UriPartial.Path);

Emprunté ici: tronquer la chaîne de requête et renvoyer une URL propre C # ASP.net

Johnny Oshika
la source
19
Version une ligne:return Request.Url.GetLeftPart(UriPartial.Path);
jp2code
uri.GetComponent(est une autre méthode géniale pour obtenir des parties d'un Uri. Je ne savais pas pour ces deux jusqu'à maintenant!
AaronLS
39

Voici ma solution:

Request.Url.AbsoluteUri.Replace(Request.Url.Query, String.Empty);
Kolman
la source
35
Request.RawUrl.Split(new[] {'?'})[0];
tyy
la source
2
J'aime cela juste pour le fait que vous pouvez l'utiliser sans uri complet.
KingOfHypocrites
Gardez à l'esprit que RawUrll'URL sera obtenue avant la réécriture de l'URL, alors peut-être utiliser AbsoluteUri? Request.Url.AbsoluteUri.Split('?')[0]
Protector one
16

Mon chemin:

new UriBuilder(url) { Query = string.Empty }.ToString()

ou

new UriBuilder(url) { Query = string.Empty }.Uri
Sam
la source
C'est ce que j'utilise pour le projet NET Core 1.0 car il n'a pas de méthode Uri.GetLeftPart. La dernière version de NET Core (1.1) devrait avoir cette méthode (je ne peux pas confirmer car je ne suis pas sur le noyau net 1.1 pour le moment)
Psulek
1
J'aime celui-ci car la création d'URI est exactement ce à quoi sert UriBuilder. Toutes les autres réponses sont de (bons) hacks.
Nine Tails
11

Vous pouvez utiliser Request.Url.AbsolutePathpour obtenir le nom de la page, ainsi que Request.Url.Authoritypour le nom d'hôte et le port. Je ne pense pas qu'il existe une propriété intégrée pour vous donner exactement ce que vous voulez, mais vous pouvez les combiner vous-même.

Brandon
la source
1
Cela me donne /mypage.aspx, pas ce que je voulais.
Rocky Singh
5

Variation Split ()

Je veux juste ajouter cette variation pour référence. Les URL sont souvent des chaînes et il est donc plus simple d'utiliser la Split()méthode que Uri.GetLeftPart(). Et Split()peut également fonctionner avec des valeurs relatives, vides et nulles alors qu'Uri lève une exception. De plus, les URL peuvent également contenir un hachage tel que /report.pdf#page=10(qui ouvre le pdf sur une page spécifique).

La méthode suivante traite tous ces types d'URL:

   var path = (url ?? "").Split('?', '#')[0];

Exemple de sortie:

Roberto
la source
2
Je suis plutôt choqué que cela n'ait pas eu de vote avant le mien. C'est une excellente solution.
jason
3

Voici une méthode d'extension utilisant la réponse de @ Kolman. Il est légèrement plus facile de se souvenir d'utiliser Path () que GetLeftPart. Vous souhaiterez peut-être renommer Path en GetPath, au moins jusqu'à ce qu'ils ajoutent des propriétés d'extension à C #.

Usage:

Uri uri = new Uri("http://www.somewhere.com?param1=foo&param2=bar");
string path = uri.Path();

La classe:

using System;

namespace YourProject.Extensions
{
    public static class UriExtensions
    {
        public static string Path(this Uri uri)
        {
            if (uri == null)
            {
                throw new ArgumentNullException("uri");
            }
            return uri.GetLeftPart(UriPartial.Path);
        }
    }
}
stevieg
la source
2

System.Uri.GetComponents, juste les composants spécifiés que vous voulez.

Uri uri = new Uri("http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye");
uri.GetComponents(UriComponents.SchemeAndServer | UriComponents.Path, UriFormat.UriEscaped);

Production:

http://www.example.com/mypage.aspx
RainVision
la source
1
    string url = "http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye";
    string path = url.split('?')[0];
Padam Singh
la source
1
Request.RawUrl.Split('?')[0]

Juste pour le nom de l'url seulement !!

Bhavishya Singh Chauhan
la source
0

Solution pour Silverlight:

string path = HtmlPage.Document.DocumentUri.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);
Chaman
la source
0

J'ai créé une extension simple, car quelques-unes des autres réponses ont jeté des exceptions nulles s'il n'y en avait pas QueryStringpour commencer:

public static string TrimQueryString(this string source)
{ 
    if (string.IsNullOrEmpty(source))
            return source;

    var hasQueryString = source.IndexOf('?') != -1;

    if (!hasQueryString)
        return source;

    var result = source.Substring(0, source.IndexOf('?'));

    return result;
}

Usage:

var url = Request.Url?.AbsoluteUri.TrimQueryString() 
Sam Jones
la source
-1

un exemple simple serait d'utiliser une sous-chaîne comme:

string your_url = "http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye";
string path_you_want = your_url .Substring(0, your_url .IndexOf("?"));
Paras
la source
-1
var canonicallink = Request.Url.Scheme + "://" + Request.Url.Authority + Request.Url.AbsolutePath.ToString();
Pradeep Balaji
la source
-3
this.Request.RawUrl.Substring(0, this.Request.RawUrl.IndexOf('?'))
Prasad Patil
la source