Получить 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


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также имя хоста и порт. Я не верю, что есть встроенная собственность, чтобы дать вам именно то, что вы хотите, но вы можете объединить их самостоятельно.


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


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


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



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.