Obtener la referencia HTTP en ASP.NET

103

Estoy buscando una forma rápida, fácil y confiable de obtener la referencia HTTP del navegador en ASP.Net ( C # ). Sé que la referencia HTTP en sí no es confiable, pero quiero una forma confiable de obtener la referencia si está presente.

Chuck Le Butt
fuente
Para Asp.Net Core, consulte ¿Cómo puedo obtener URL de referencia en ASP.NET Core MVC?
Michael Freidgeim

Respuestas:

166

Puede usar la propiedad UrlReferrer de la solicitud actual:

Request.UrlReferrer

Esto leerá el encabezado HTTP Referer de la solicitud que puede o no ser proporcionado por el cliente (agente de usuario).

Darin Dimitrov
fuente
8
Cabe señalar que esta propiedad arrojará una excepción System.UriFormatException si el encabezado HTTP del referente está mal formado.
NightOwl888
1
@Darin Dimitrov Estoy intentando crear una API REST usando la API WEB. UrlReferrer no forma parte del objeto Request. Debo agregar algo de "uso", etc. ¿Qué me estoy perdiendo? una DLL?
Ravi
1
Cabe señalar que la diferencia de ortografía es correcta. El encabezado http está mal escrito. MS usa la ortografía correcta en el nombre de la propiedad. Desafortunadamente, los dos no coinciden, lo que puede causar confusión a algunas personas (yo) al realizar la prueba.
John
8
Tenga cuidado si está utilizando Request.UrlReferrerdespués de una devolución de datos del lado del servidor. Por supuesto Request.UrlReferrer, ahora tendrá el valor de la página en la que está publicando. En la mayoría de los casos, las personas necesitan la página anterior. En este caso, asegúrese de almacenar la página anterior en, por ejemplo, una variable viewstate cuando la página se carga por primera vez. Y luego, cuando accede a esta variable, tiene la página anterior de la que vino. Por ejemplo, en el evento de carga de la página de formularios asp.net, puede hacer:if (Request.UrlReferrer != null) ViewState["PreviousPageUrl"] = Request.UrlReferrer.ToString();
JonH
4
... y cuando publiques, por ejemplo, podrías hacer:Response.Redirect(ViewState["PreviousPageUrl"] != null ? ViewState["PreviousPageUrl"].ToString() : "SomeOtherPage.aspx");
JonH
20

Usa la Request.UrlReferrerpropiedad.

Debajo de las escenas, solo está revisando la ServerVariables("HTTP_REFERER")propiedad.

Despedir
fuente
2
Entonces, no habría ninguna diferencia si usara: HttpContext.Current.Request.ServerVariables ["HTTP_REFERER"]?
Chuck Le Butt
2
En teoría, no hay diferencia, en la práctica no puedo decirlo con certeza, ya que una mirada rápida con reflector muestra que UrlReferrerhace mucho más que una simple llamada aServerVariables("HTTP_REFERER")
Diadistis
13
Puedo decirte que ServerVariables["HTTP_REFERER"]devuelve una cadena , mientras que Request.UrlReferrerdevuelve un Uri .
Chuck Le Butt
19
Request.Headers["Referer"]

Explicación

La Request.UrlRefererpropiedad arrojará un System.UriFormatExceptionsi el encabezado HTTP del referente está mal formado (lo que puede suceder ya que generalmente no está bajo su control).

En cuanto al uso Request.ServerVariables, por MSDN:

Request.ServerVariables Collection

La colección ServerVariables recupera los valores de variables de entorno predeterminadas y solicita información de encabezado.

Propiedad Request.Headers

Obtiene una colección de encabezados HTTP.

Request.Headerses una mejor opción que Request.ServerVariables, ya que Request.ServerVariablescontiene todas las variables de entorno, así como los encabezados, donde Request.Headershay una lista mucho más corta que solo contiene los encabezados.

Entonces, la mejor solución es usar la Request.Headerscolección para leer el valor directamente. Sin embargo, preste atención a las advertencias de Microsoft sobre la codificación HTML del valor si lo va a mostrar en un formulario.

NightOwl888
fuente
2
Tenga en cuenta que el Refererencabezado se escribe de manera diferente a la HTTP_REFERRERvariable del servidor.
Rudey
13

Así: Propiedad HttpRequest.UrlReferrer

Uri myReferrer = Request.UrlReferrer;
string actual = myReferrer.ToString();
Tom
fuente
2
Para protegerse contra nulos, puede decir: string actual = "" + Request.UrlReferrer ?? "(defecto)"; // (predeterminado) puede ser una cadena vacía
Sheepy
10

Estoy usando .Net Core 2 mvc, este funciona para mí (para obtener la página de vistas previas):

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

Dado que Google lo lleva a esta publicación cuando busca, C# Web API Referreraquí está el trato: Web APIusa un tipo diferente de llamado Requestnormal que no incluye . Dado que una solicitud normal no incluye esta información, si realmente la necesita, debe hacer que sus clientes hagan todo lo posible para incluirla. Aunque podría hacer que esto sea parte de su , una mejor manera es usar .MVC RequestHttpRequestMessageUrlReferrerWeb APIAPI ObjectHeaders

Primero, puede extender HttpRequestMessagepara proporcionar un UrlReferrer()método:

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

Entonces sus clientes deben configurar el Referrer Headera su API Request:

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

Y ahora Web API Requestincluye los datos de referencia a los que puede acceder así desde su Web API:

Request.UrlReferrer();
Serj Sagan
fuente
2
string referrer = HttpContext.Current.Request.UrlReferrer.ToString();
Donat Sasin
fuente
1
Esto es para ApiController. Aunque eso es lo que necesitaba.
Csaba Toth
2

En algún momento debes dar todo el enlace así

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

(en opción cuando "Actual" no está fundado)

Sportac
fuente
0

Al pertenecer a otra respuesta, he agregado una cláusula de condición para obtener nulos.

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