Получить URL без строки запроса

189

У меня есть такой URL:

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

Я хочу получить http://www.example.com/mypage.aspxот этого.

Можете ли вы сказать мне, как я могу получить это?

Роки Сингх
источник

Ответы:

129

Ты можешь использовать 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);

Или вы можете использовать substring

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

РЕДАКТИРОВАТЬ: изменение первого решения, чтобы отразить предложение brillyfresh в комментариях.

мистифицировать
источник
6
url.AbsolutePath возвращает только часть пути URL (/mypage.aspx); добавьте url.Scheme (http) + Uri.SchemeDelimiter (: //) + url.Authority (www.somesite.com) для получения полного URL-адреса, который вы хотели
Райан,
20
Метод Uri.GetLeftPart является более простым, как уже упоминалось stackoverflow.com/questions/1188096/…
Эдвард Уайльд,
substringМетод даст ошибку , если нет строки запроса. Используйте string path = url.Substring(0, url.IndexOf("?") > 0? url.IndexOf("?") : url.Length);вместо этого.
стомия
378

Вот более простое решение:

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

Заимствовано здесь: усечение строки запроса и возврат чистого URL C # ASP.net

Джонни Ошика
источник
17
return Request.Url.GetLeftPart(UriPartial.Path);
Однострочная
uri.GetComponent(еще один замечательный метод получения частей Uri. Я не знал об этих двоих до сих пор!
AaronLS
38

Это мое решение:

Request.Url.AbsoluteUri.Replace(Request.Url.Query, String.Empty);
Кольман
источник
35
Request.RawUrl.Split(new[] {'?'})[0];
тыы
источник
2
Мне нравится это только потому, что вы можете использовать его без полного URI.
KingOfHypocrites
Имейте в виду, что RawUrlURL- адрес будет получен до того, как URL будет перезаписан, так что, возможно, используйте AbsoluteUri? Request.Url.AbsoluteUri.Split('?')[0]
Защитник один
16

Мой путь:

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

или

new UriBuilder(url) { Query = string.Empty }.Uri
Суббота
источник
Это то, что я использую для проекта NET Core 1.0, потому что у него нет метода Uri.GetLeftPart. Последняя версия NET Core (1.1) должна иметь этот метод (не могу подтвердить, потому что я сейчас не в сетевом ядре 1.1)
psulek
1
Мне нравится этот, потому что создание URI - это именно то, для чего предназначен UriBuilder. Все остальные ответы - (хорошие) хаки.
Девять Хвостов
11

Вы можете использовать, Request.Url.AbsolutePathчтобы получить имя страницы, а Request.Url.Authorityтакже имя хоста и порт. Я не верю, что есть встроенная собственность, чтобы дать вам именно то, что вы хотите, но вы можете объединить их самостоятельно.

Brandon
источник
1
Это дает мне /mypage.aspx, а не то, что я хотел.
Рокки Сингх
4

Разбить () Вариация

Я просто хочу добавить этот вариант для справки. URL-адреса часто являются строками, поэтому использовать Split()метод проще, чем Uri.GetLeftPart(). И Split()также может работать с относительными, пустыми и нулевыми значениями, тогда как Uri выдает исключение. Кроме того, URL-адреса могут также содержать хэш, например /report.pdf#page=10(который открывает PDF на определенной странице).

Следующий метод имеет дело со всеми этими типами URL:

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

Пример вывода:

Роберто
источник
1
Я довольно шокирован, это не получило никаких голосов до моего собственного. Это отличное решение.
Джейсон
3

Вот метод расширения, использующий ответ @ Kolman. Немного легче запомнить использование Path (), чем GetLeftPart. Возможно, вы захотите переименовать Path в GetPath, по крайней мере, пока они не добавят свойства расширения в C #.

Использование:

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

Класс:

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
источник
1
    string url = "http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye";
    string path = url.split('?')[0];
Падам сингх
источник
1

System.Uri.GetComponentsТолько что указанные компоненты, которые вы хотите.

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

Вывод:

http://www.example.com/mypage.aspx
RainVision
источник
1
Request.RawUrl.Split('?')[0]

Только для названия URL!

Бхавишья Сингх Чаухан
источник
0

Решение для Silverlight:

string path = HtmlPage.Document.DocumentUri.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);
шаман
источник
0

Я создал простое расширение, так как некоторые другие ответы выдавали нулевые исключения, если не было QueryStringс чего начать:

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

Использование:

var url = Request.Url?.AbsoluteUri.TrimQueryString() 
Сэм Джонс
источник
-1

простой пример будет использовать подстроку как:

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
источник
-1
var canonicallink = Request.Url.Scheme + "://" + Request.Url.Authority + Request.Url.AbsolutePath.ToString();
Прадип Баладжи
источник
-3
this.Request.RawUrl.Substring(0, this.Request.RawUrl.IndexOf('?'))
Прасад Патил
источник