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ć?

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.


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


38

To jest moje rozwiązanie:

Request.Url.AbsoluteUri.Replace(Request.Url.Query, String.Empty);

35
Request.RawUrl.Split(new[] {'?'})[0];

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

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ć.


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:


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

1
    string url = "http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye";
    string path = url.split('?')[0];

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


0

Rozwiązanie dla Silverlight:

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

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() 

-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("?"));

-1
var canonicallink = Request.Url.Scheme + "://" + Request.Url.Authority + Request.Url.AbsolutePath.ToString();


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.