Obtendo o referenciador HTTP no ASP.NET

103

Estou procurando uma maneira rápida, fácil e confiável de obter o HTTP Referrer do navegador em ASP.Net ( C # ). Sei que o referenciador HTTP em si não é confiável, mas quero uma maneira confiável de obter o referenciador, se estiver presente.

Chuck Le Butt
fonte
2
possível duplicata de Como obtenho a URL referenciadora em uma ação ASP.NET MVC?
Big McLargeHuge
Para Asp.Net Core, consulte Como posso obter o URL Referrer no ASP.NET Core MVC?
Michael Freidgeim

Respostas:

166

Você pode usar a propriedade UrlReferrer da solicitação atual:

Request.UrlReferrer

Isso lerá o cabeçalho Referer HTTP da solicitação, que pode ou não ser fornecida pelo cliente (agente do usuário).

Darin Dimitrov
fonte
8
Deve-se observar que essa propriedade lançará uma System.UriFormatException se o cabeçalho HTTP do referenciador estiver malformado.
NightOwl888
1
@Darin Dimitrov Estou tentando criar uma API REST usando a API WEB. UrlReferrer não faz parte do objeto Request. Devo adicionar alguns "usando" etc. O que estou perdendo? uma DLL?
Ravi
1
Deve-se notar que a diferença na grafia está correta. O cabeçalho http está incorreto. O MS usa a grafia correta no nome da propriedade. Infelizmente, os dois não correspondem, o que pode causar confusão para algumas pessoas (eu) durante o teste.
John
8
Tenha cuidado se você estiver usando Request.UrlReferrerapós um postback do lado do servidor. É claro Request.UrlReferrerque agora terá o valor da página para a qual você está postando. Na maioria dos casos, as pessoas precisam da página anterior. Nesse caso, certifique-se de armazenar a página anterior em uma variável viewstate quando a página for carregada pela primeira vez. E então quando você acessa esta variável ela tem a página anterior de onde você veio. Por exemplo, no evento de carregamento de página de formulários asp.net, você pode fazer:if (Request.UrlReferrer != null) ViewState["PreviousPageUrl"] = Request.UrlReferrer.ToString();
JonH
4
... e quando você postar de volta, por exemplo, você poderia fazer:Response.Redirect(ViewState["PreviousPageUrl"] != null ? ViewState["PreviousPageUrl"].ToString() : "SomeOtherPage.aspx");
JonH
20

Use a Request.UrlReferrerpropriedade.

Por baixo das cenas é só verificar a ServerVariables("HTTP_REFERER")propriedade.

Dismissile
fonte
2
Portanto, não seria diferente se eu usasse: HttpContext.Current.Request.ServerVariables ["HTTP_REFERER"]?
Chuck Le Butt
2
Em teoria não há diferença, na prática não posso dizer com certeza, pois uma rápida olhada com refletor mostra que UrlReferrerfaz muito mais do que uma simples ligação paraServerVariables("HTTP_REFERER")
Diadistis
13
Posso dizer que isso ServerVariables["HTTP_REFERER"]retorna uma string , enquanto Request.UrlReferrerretorna um Uri .
Chuck Le Butt
19
Request.Headers["Referer"]

Explicação

A Request.UrlRefererpropriedade lançará um System.UriFormatExceptionse o cabeçalho HTTP referenciador estiver malformado (o que pode acontecer, pois geralmente não está sob seu controle).

Quanto ao uso Request.ServerVariables, por MSDN:

Coleção Request.ServerVariables

A coleção ServerVariables recupera os valores de variáveis ​​de ambiente predeterminadas e informações de cabeçalho de solicitação.

Propriedade Request.Headers

Obtém uma coleção de cabeçalhos HTTP.

Request.Headersé uma escolha melhor do que Request.ServerVariables, uma vez que Request.ServerVariablescontém todas as variáveis ​​de ambiente, bem como os cabeçalhos, onde Request.Headershá uma lista muito mais curta que contém apenas os cabeçalhos.

Portanto, a melhor solução é usar a Request.Headerscoleção para ler o valor diretamente. No entanto, preste atenção aos avisos da Microsoft sobre a codificação HTML do valor, se você for exibi-lo em um formulário.

NightOwl888
fonte
2
Observe que o Referercabeçalho é escrito de forma diferente da HTTP_REFERRERvariável do servidor.
Rudey
13

Assim: HttpRequest.UrlReferrer Property

Uri myReferrer = Request.UrlReferrer;
string actual = myReferrer.ToString();
Tom
fonte
2
Para se proteger contra null, você pode dizer: string actual = "" + Request.UrlReferrer ?? "(padrão)"; // (padrão) pode ser uma string vazia
Sheepy
10

Estou usando .Net Core 2 mvc, este funciona para mim (para obter a página de pré-visualizações):

HttpContext.Request.Headers["Referer"];
Saad Hasan
fonte
9

Uma vez que o Google leva você a este post ao pesquisar, C# Web API Referreraqui está o negócio: Web APIusa um tipo diferente de chamado Requestnormal que não inclui . Como uma solicitação normal não inclui essas informações, se você realmente precisar delas, faça com que seus clientes façam o possível para incluí-las. Embora você possa fazer com que isso faça parte do seu , a melhor maneira é usar .MVC RequestHttpRequestMessageUrlReferrerWeb APIAPI ObjectHeaders

Primeiro, você pode estender HttpRequestMessagepara fornecer um UrlReferrer()método:

public static string UrlReferrer(this HttpRequestMessage request)
{
    return request.Headers.Referrer == null ? "unknown" : request.Headers.Referrer.AbsoluteUri;
}

Em seguida, seus clientes precisam definir o Referrer Headerpara API Request:

// Microsoft.AspNet.WebApi.Client
client.DefaultRequestHeaders.Referrer = new Uri(url);

E agora Web API Requestinclui os dados de referência que você pode acessar assim a partir de Web API:

Request.UrlReferrer();
Serj Sagan
fonte
2
string referrer = HttpContext.Current.Request.UrlReferrer.ToString();
Donat Sasin
fonte
1
Isso é para ApiController. Isso é o que eu precisava, no entanto.
Csaba Toth
2

Às vezes você deve fornecer todos os links como este

System.Web.HttpContext.Current.Request.UrlReferrer.ToString();

(na opção quando "Atual" não for fundado)

Sportac
fonte
0

Pertencente a outra resposta, adicionei a cláusula de condição para obter nulo.

string ComingUrl = "";
if (Request.UrlReferrer != null)
{
    ComingUrl = System.Web.HttpContext.Current.Request.UrlReferrer.ToString();
}
else
{
    ComingUrl = "Direct"; // Your code
}
Mrbengi
fonte