Отримайте 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("?"));

EDIT: Модифікація першого рішення, щоб відобразити пропозицію brillyfresh у коментарях.


6
url.AbsolutePath повертає лише частину шляху URL-адреси (/mypage.aspx); додайте url.Scheme (http) + Uri.SchemeDelimiter (: //) + url.Authority (www.somesite.com) для отримання повної URL-адреси, яку ви хотіли
Ryan

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

uri.GetComponent(- ще один дивовижний метод отримання частин урі. Я не знав про цих двох до цих пір!
AaronLS


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

2
Мені це подобається лише за те, що ти можеш використовувати його без повного урі.
KingOfHypocrites

Майте на увазі, що RawUrlотримаєте URL перед перезаписом 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, а не те, що я хотів.
Rocky Singh

4

Спліт () Варіація

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

Наступний метод стосується всіх цих типів URL-адрес:

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

Приклад Вихід:


1
Я досить шокований, що до цього моменту я не отримав жодних відгуків. Це чудове рішення.
Джейсон

3

Ось метод розширення за допомогою відповіді @ Колмана. Користуватися Path () набагато простіше запам'ятати, ніж GetLeftPart. Ви можете перейменувати Шлях на 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.