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?

Rocky Singh
fuente

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.

Josh
fuente
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

Johnny Oshika
fuente
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);
Kolman
fuente
35
Request.RawUrl.Split(new[] {'?'})[0];
tyy
fuente
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
33

Buena respuesta también encontrada aquí fuente de respuesta

Request.Url.GetLeftPart(UriPartial.Path)
Abdelfattah Ragab
fuente
16

Mi manera:

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

o

new UriBuilder(url) { Query = string.Empty }.Uri
Se sentó
fuente
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.

Brandon
fuente
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:

Roberto
fuente
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);
        }
    }
}
stevieg
fuente
1
    string url = "http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye";
    string path = url.split('?')[0];
Padam Singh
fuente
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
RainVision
fuente
1
Request.RawUrl.Split('?')[0]

¡Solo por nombre de URL!

Bhavishya Singh Chauhan
fuente
0

Solución para Silverlight:

string path = HtmlPage.Document.DocumentUri.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);
Chamán
fuente
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() 
Sam Jones
fuente
-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("?"));
Paras
fuente
-1
var canonicallink = Request.Url.Scheme + "://" + Request.Url.Authority + Request.Url.AbsolutePath.ToString();
Pradeep Balaji
fuente
-3
this.Request.RawUrl.Substring(0, this.Request.RawUrl.IndexOf('?'))
Prasad Patil
fuente