request uri asp.net-core

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.