Удалить последний сегмент Request.Url

Я хотел бы удалить последний сегмент Request.Url, поэтому, например...

http://www.example.com/admin/users.aspx/deleteUser

изменится на

http://www.example.com/admin/users.aspx

Я бы предпочел linq, но принял любое эффективное решение.

Ответ 1

Используйте класс Uri для анализа URI - вы можете получить доступ ко всем сегментам с помощью свойства Segments и перестроить URI без последнего сегмента.

var uri = new Uri(myString);

var noLastSegment = string.Format("{0}://{1}", uri.Scheme, uri.Authority);

for(int i = 0; i < uri.Segments.Length - 1; i++)
{
   noLastSegment += uri.Segments[i];
}

noLastSegment = noLastSegment.Trim("/".ToCharArray()); // remove trailing `/`

В качестве альтернативы получить схему и имя хоста, как предлагает Dour High Arch в своем комментарии:

var noLastSegment = uri.GetComponents(UriComponents.SchemeAndServer, 
                                      UriFormat.SafeUnescaped);

Ответ 2

То же самое, что и @Oded, но вместо этого использует UriBuilder:

var uri = new Uri("http://www.example.com/admin/users.aspx/deleteUser");
var newSegments = uri.Segments.Take(uri.Segments.Length - 1).ToArray();
newSegments[newSegments.Length-1] = 
    newSegments[newSegments.Length-1].TrimEnd('/');
var ub=new UriBuilder(uri);
ub.Path=string.Concat(newSegments);
//ub.Query=string.Empty;  //maybe?
var newUri=ub.Uri;

Ответ 3

Ну, тривиальным решением было бы итерацию char на char от конца строки к ее началу и поиск первого "/" (я думаю, это также пришло вам в голову).

Попробуйте следующее:

string url = "http://www.example.com/admin/users.aspx/deleteUser";

for (int i = url.Length - 1; i >= 0; i--) {

    if (url[i] == '/') return url.Substring(0, i - 1);
}

Ответ 4

Чтобы удалить последний сегмент Request.Url, достаточно вычесть из абсолютного uri длину последнего сегмента.

string uriWithoutLastSegment = Request.Url.AbsoluteUri.Remove(
  Request.Url.AbsoluteUri.Length - Request.Url.Segments.Last().Length );