Obtener URL sin procesar de Microsoft.AspNet.Http.HttpRequest
uri asp.net-core (8)
Agregue el paquete Nuget / usando:
using Microsoft.AspNetCore.Http.Extensions;
(En ASP.NET Core RC1 esto estaba en Microsoft.AspNet.Http.Extensions)
entonces puede obtener la url de solicitud http completa ejecutando:
var url = httpContext.Request.GetEncodedUrl();
o
var url = httpContext.Request.GetDisplayUrl();
Dependiendo de los propósitos.
La clase
HttpRequest
en Asp.Net 5 (vNext) contiene (entre otras cosas) detalles analizados sobre la URL de la solicitud, como
Scheme
,
Host
,
Path
, etc.
Sin embargo, aún no he visto ningún lugar que exponga la URL de solicitud original, solo estos valores analizados.
(En versiones anteriores había
Request.Uri
)
¿Puedo recuperar la URL sin procesar sin tener que juntarla de los componentes disponibles en HttpRequest?
El siguiente método de extensión reproduce la lógica del UriHelper pre-
UriHelper
:
public static string RawUrl(this HttpRequest request) {
if (string.IsNullOrEmpty(request.Scheme)) {
throw new InvalidOperationException("Missing Scheme");
}
if (!request.Host.HasValue) {
throw new InvalidOperationException("Missing Host");
}
string path = (request.PathBase.HasValue || request.Path.HasValue) ? (request.PathBase + request.Path).ToString() : "/";
return request.Scheme + "://" + request.Host + path + request.QueryString;
}
En ASP.NET 5 beta5:
Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
En páginas de razor ASP.NET Core 2.x:
@using Microsoft.AspNetCore.Http.Extensions
@Context.Request.GetEncodedUrl() //Use for any purpose (encoded for safe automation)
También hay otra función:
@Context.Request.GetDisplayUrl() //Use to display the URL only
Esta extensión funciona para mí:
utilizando Microsoft.AspNetCore.Http;
public static class HttpRequestExtensions
{
public static string GetRawUrl(this HttpRequest request)
{
var httpContext = request.HttpContext;
return $"{httpContext.Request.Scheme}://{httpContext.Request.Host}{httpContext.Request.Path}{httpContext.Request.QueryString}";
}
}
Las otras soluciones no se ajustaban bien a mis necesidades porque quería directamente un objeto
URI
y creo que es mejor evitar la concatenación de cadenas (también) en este caso, así que creé estos métodos de extensión que usar un
UriBuilder
y funciona también con URL como
http://localhost:2050
:
public static Uri GetUri(this HttpRequest request)
{
var uriBuilder = new UriBuilder
{
Scheme = request.Scheme,
Host = request.Host.Host,
Port = request.Host.Port.GetValueOrDefault(80),
Path = request.Path.ToString(),
Query = request.QueryString.ToString()
};
return uriBuilder.Uri;
}
Parece que no puedes acceder a él directamente, pero puedes construirlo usando el marco:
Microsoft.AspNetCore.Http.Extensions.UriHelper.GetFullUrl(Request)
También puede usar lo anterior como un método de extensión.
Esto devuelve una
string
lugar de un
Uri
, ¡pero debería servir para ese propósito!
(Esto también parece cumplir el rol de
UriBuilder
, también).
¡Gracias a @mswietlicki por señalar que se ha refactorizado en lugar de faltar! ¡Y también a @CF para señalar el cambio de espacio de nombres en mi respuesta!
Si realmente desea la URL real, sin formato , puede utilizar el siguiente método de extensión:
public static class HttpRequestExtensions
{
public static Uri GetRawUrl(this HttpRequest request)
{
var httpContext = request.HttpContext;
var requestFeature = httpContext.Features.Get<IHttpRequestFeature>();
return new Uri(requestFeature.RawTarget);
}
}
Este método utiliza el
RawTarget
de la solicitud, que no aparece en el objeto
HttpRequest
.
Esta propiedad se agregó en la versión 1.0.0 de ASP.NET Core.
Asegúrate de estar ejecutando esa o una versión más nueva.
¡NOTA! Esta propiedad expone la URL sin procesar , por lo que no se ha decodificado, como se señala en la documentación:
Esta propiedad no se usa internamente para decisiones de enrutamiento o autorización. No ha sido UrlDecoded y se debe tener cuidado en su uso.