Obter URL sem querystring


189

Eu tenho um URL como este:

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

Eu quero sair http://www.example.com/mypage.aspxdisso.

Você pode me dizer como posso obtê-lo?

Respostas:


129

Você pode 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);

Ou você pode usar substring

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

EDIT: Modificando a primeira solução para refletir a sugestão de brillyfresh nos comentários.


6
url.AbsolutePath retorna apenas a parte do caminho da URL (/mypage.aspx); prepend url.Scheme (http) + Uri.SchemeDelimiter (: //) + url.Authority (www.somesite.com) para o URL completo que você queria
Ryan

20
O método Uri.GetLeftPart é mais simples, como mencionado stackoverflow.com/questions/1188096/…
Edward Wilde

O substringmétodo dará erro se não houver uma string de consulta. Use em string path = url.Substring(0, url.IndexOf("?") > 0? url.IndexOf("?") : url.Length);vez disso.
Stom #

378

Aqui está uma solução mais simples:

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

Emprestado aqui: Truncando a string de consulta e retornando URL limpo C # ASP.net


17
Uma versão de linha:return Request.Url.GetLeftPart(UriPartial.Path);
jp2code 01/09/16

uri.GetComponent(é outro método incrível para obter partes de um Uri. Eu não sabia sobre esses dois até agora!
AaronLS

38

Esta é a minha solução:

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

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

2
Eu gosto disso apenas pelo fato de que você pode usá-lo sem uma uri completa.
KingOfHypocrites

Lembre-se de que RawUrlo URL será obtido antes que o URL seja reescrito AbsoluteUri. Request.Url.AbsoluteUri.Split('?')[0]
Protector one


16

O meu caminho:

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

ou

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

Isto é o que eu uso para o projeto NET Core 1.0, porque não possui método Uri.GetLeftPart. Última versão do NET núcleo (1.1) deveria ter esse método (confirmar não posso porque eu não estou no núcleo net 1,1 por agora)
psulek

1
Eu gosto deste porque criar URIs é exatamente para o que serve o UriBuilder. Todas as outras respostas são hacks (boas).
Nove Tails

11

Você pode usar Request.Url.AbsolutePathpara obter o nome da página e Request.Url.Authorityo nome do host e porta. Não acredito que exista uma propriedade incorporada para fornecer exatamente o que você deseja, mas você pode combiná-las.


1
Está me dando /mypage.aspx, não o que eu queria.
Rocky Singh

4

Variação Split ()

Eu só quero adicionar essa variação para referência. Os URLs geralmente são strings e, portanto, é mais simples de usar o Split()método Uri.GetLeftPart(). E Split()também pode ser feito para trabalhar com valores relativos, vazios e nulos, enquanto Uri lança uma exceção. Além disso, os URLs também podem conter um hash, como/report.pdf#page=10 (que abre o pdf em uma página específica).

O método a seguir lida com todos esses tipos de URLs:

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

Saída de exemplo:


1
Estou um pouco chocado por isso não ter recebido nenhum voto positivo até o meu. Esta é uma otima soluçao.
jason

3

Aqui está um método de extensão usando a resposta de @ Kolman. É marginalmente mais fácil lembrar de usar Path () do que GetLeftPart. Você pode renomear Path para GetPath, pelo menos até que eles adicionem propriedades de extensão ao C #.

Uso:

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

A classe:

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


0

Solução para Silverlight:

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

0

Eu criei uma extensão simples, pois algumas das outras respostas lançaram exceções nulas se não houvesse um QueryStringcomeço:

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

0

System.Uri.GetComponents, apenas componentes especificados que você deseja.

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

Resultado:

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

-1

Um exemplo simples seria usar substring 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();


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.