Obtener url sin cadena de consulta


189

Tengo una URL como esta:

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

Quiero sacarme http://www.example.com/mypage.aspxde eso.

¿Me puede decir cómo puedo conseguirlo?

Respuestas:


129

Puedes usar 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);

O puedes usar substring

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

EDITAR: Modificar la primera solución para reflejar la sugerencia de brillyfresh en los comentarios.


66
url.AbsolutePath solo devuelve la porción de ruta de la URL (/mypage.aspx); anteponer url.Scheme (http) + Uri.SchemeDelimiter (: //) + url.Authority (www.somesite.com) para obtener la URL completa que deseaba
Ryan

20
El método Uri.GetLeftPart es más simple como se menciona stackoverflow.com/questions/1188096/…
Edward Wilde

El substringmétodo dará error si no hay una cadena de consulta. Usar en su string path = url.Substring(0, url.IndexOf("?") > 0? url.IndexOf("?") : url.Length);lugar.
stomy

378

Aquí hay una solución más simple:

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

Prestado desde aquí: Truncar cadena de consulta y devolver URL limpia C # ASP.net


17
Versión de una línea:return Request.Url.GetLeftPart(UriPartial.Path);
jp2code del

uri.GetComponent(Es otro método increíble para obtener partes de un Uri. ¡No sabía sobre estos dos hasta ahora!
AaronLS

38

Esta es mi solución:

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

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

2
Me gusta esto solo por el hecho de que puedes usarlo sin una uri completa.
KingOfHypocrites

Tenga en cuenta que RawUrlobtendrá la URL antes de que la URL se reescriba, así que ¿quizás usarla AbsoluteUri? Request.Url.AbsoluteUri.Split('?')[0]
Protector uno


16

Mi manera:

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

o

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

Esto es lo que uso para el proyecto NET Core 1.0 porque no tiene método Uri.GetLeftPart. La última versión de NET Core (1.1) debería tener ese método (no puedo confirmar porque no estoy en net core 1.1 por ahora)
psulek

1
Me gusta este porque construir URIs es exactamente para lo que sirve el UriBuilder. Todas las otras respuestas son (buenas) hacks.
Nine Tails

11

Puede usar Request.Url.AbsolutePathpara obtener el nombre de la página y Request.Url.Authorityel nombre de host y el puerto. No creo que haya una propiedad incorporada para darle exactamente lo que desea, pero puede combinarlos usted mismo.


1
Me está dando /mypage.aspx, no lo que quería.
Rocky Singh

4

Split () Variación

Solo quiero agregar esta variación como referencia. Las URL a menudo son cadenas y, por lo tanto, es más sencillo usar el Split()método que Uri.GetLeftPart(). Y Split()también se puede hacer que funcione con valores relativos, vacíos y nulos, mientras que Uri arroja una excepción. Además, las URL también pueden contener un hash como/report.pdf#page=10 (que abre el pdf en una página específica).

El siguiente método se ocupa de todos estos tipos de URL:

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

Salida de ejemplo:


1
Estoy bastante sorprendido de que esto no haya recibido ningún voto positivo hasta el mío. Esta es una gran solución.
Jason

3

Aquí hay un método de extensión usando la respuesta de @ Kolman. Es marginalmente más fácil recordar usar Path () que GetLeftPart. Es posible que desee cambiar el nombre de Path to GetPath, al menos hasta que agreguen propiedades de extensión a C #.

Uso:

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

La clase:

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, solo los componentes especificados que desea.

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

Salida:

http://www.example.com/mypage.aspx


0

Solución para Silverlight:

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

0

He creado una extensión simple, ya que algunas de las otras respuestas arrojaron excepciones nulas si no hubiera una QueryStringpara comenzar:

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

Uso:

var url = Request.Url?.AbsoluteUri.TrimQueryString() 

-1

ejemplo simple sería usar una subcadena como:

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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.