Uzyskaj adres URL bez zapytania

189

Mam taki adres URL:

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

Chcę z tego wyjść http://www.example.com/mypage.aspx.

Czy możesz mi powiedzieć, jak mogę to zdobyć?

Rocky Singh
źródło

Odpowiedzi:

129

Możesz użyć 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);

Lub możesz użyć substring

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

EDYCJA: Modyfikacja pierwszego rozwiązania w celu odzwierciedlenia sugestii brillyfresh w komentarzach.

Josh
źródło
6
url.AbsolutePath zwraca tylko część ścieżki adresu URL (/mypage.aspx); dodaj url.Scheme (http) + Uri.SchemeDelimiter (: //) + url.Authority (www.somesite.com) dla pełnego adresu URL, którego chciałeś
Ryan
20
Metoda Uri.GetLeftPart jest prostsza, jak wspomniano stackoverflow.com/questions/1188096/…
Edward Wilde,
substringMetoda da błąd, jeśli nie ma ciąg zapytań. Użyj string path = url.Substring(0, url.IndexOf("?") > 0? url.IndexOf("?") : url.Length);zamiast tego.
stomy
378

Oto prostsze rozwiązanie:

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

Pożyczono stąd: Obcinanie ciągu zapytania i zwracanie czystego adresu URL C # ASP.net

Johnny Oshika
źródło
17
Wersja jednoliniowa:return Request.Url.GetLeftPart(UriPartial.Path);
jp2code
uri.GetComponent(to kolejna niesamowita metoda uzyskiwania części Uri. Do tej pory nie wiedziałem o tych dwóch!
AaronLS,
38

To jest moje rozwiązanie:

Request.Url.AbsoluteUri.Replace(Request.Url.Query, String.Empty);
Kolman
źródło
35
Request.RawUrl.Split(new[] {'?'})[0];
tyy
źródło
2
Podoba mi się to tylko dlatego, że można go używać bez pełnego URI.
KingOfHypocrites
Pamiętaj, że RawUrldostanie adres URL przed jego ponownym zapisaniem, więc może użyj AbsoluteUri? Request.Url.AbsoluteUri.Split('?')[0]
Protektor jeden
16

Moja droga:

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

lub

new UriBuilder(url) { Query = string.Empty }.Uri
Sob
źródło
Tego używam do projektu NET Core 1.0, ponieważ nie ma metody Uri.GetLeftPart. Najnowsza wersja NET Core (1.1) powinna mieć tę metodę (nie mogę potwierdzić, ponieważ nie jestem na razie w wersji Net Core 1.1)
psulek
1
Podoba mi się ten, ponieważ tworzenie URI jest dokładnie tym, do czego służy UriBuilder. Wszystkie pozostałe odpowiedzi to (dobre) hacki.
Dziewięć ogonów
11

Możesz użyć, Request.Url.AbsolutePathaby uzyskać nazwę strony oraz Request.Url.Authoritynazwę hosta i port. Nie wierzę, że istnieje wbudowana własność, która da ci dokładnie to, czego chcesz, ale możesz sam je połączyć.

Brandon
źródło
1
Daje mi /mypage.aspx, a nie to, czego chciałem.
Rocky Singh,
4

Wariant Split ()

Chcę tylko dodać tę odmianę w celach informacyjnych. Adresy URL są często ciągami znaków, więc łatwiej jest użyć tej Split()metody niż Uri.GetLeftPart(). I Split()może być również zmuszony do pracy z wartościami względnymi, pustymi i zerowymi, podczas gdy Uri zgłasza wyjątek. Ponadto adresy URL mogą również zawierać skrót, taki jak /report.pdf#page=10(który otwiera plik pdf na określonej stronie).

Poniższa metoda dotyczy wszystkich tych typów adresów URL:

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

Przykładowe dane wyjściowe:

Roberto
źródło
1
Jestem raczej zszokowany, że nie uzyskałem żadnych pozytywnych opinii aż do moich. To świetne rozwiązanie.
jason
3

Oto metoda rozszerzenia wykorzystująca odpowiedź @ Kolmana. Nieco łatwiej jest pamiętać o użyciu Path () niż GetLeftPart. Możesz zmienić nazwę ścieżki na GetPath, przynajmniej dopóki nie dodadzą właściwości rozszerzenia do C #.

Stosowanie:

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

Klasa:

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);
        }
    }
}
Stevie
źródło
1
    string url = "http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye";
    string path = url.split('?')[0];
Padam Singh
źródło
1

System.Uri.GetComponents, właśnie określone komponenty, które chcesz.

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

Wynik:

http://www.example.com/mypage.aspx
RainVision
źródło
1
Request.RawUrl.Split('?')[0]

Tylko dla nazwy adresu URL !!

Bhavishya Singh Chauhan
źródło
0

Rozwiązanie dla Silverlight:

string path = HtmlPage.Document.DocumentUri.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);
Szaman
źródło
0

Stworzyłem proste rozszerzenie, ponieważ kilka innych odpowiedzi zniosło zerowe wyjątki, jeśli nie było QueryStringna początek:

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

Stosowanie:

var url = Request.Url?.AbsoluteUri.TrimQueryString() 
Sam Jones
źródło
-1

prostym przykładem byłoby użycie podciągów takich jak:

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
źródło
-1
var canonicallink = Request.Url.Scheme + "://" + Request.Url.Authority + Request.Url.AbsolutePath.ToString();
Pradeep Balaji
źródło
-3
this.Request.RawUrl.Substring(0, this.Request.RawUrl.IndexOf('?'))
Prasad Patil
źródło