Después de RC2 y 1.0 , ya no necesita inyectarse una IHttpContextAccessor
clase de extensión. Está disponible de inmediato en IUrlHelper
el urlhelper.ActionContext.HttpContext.Request
. Luego, crearía una clase de extensión siguiendo la misma idea, pero más simple ya que no habrá ninguna inyección involucrada.
public static string AbsoluteAction(
this IUrlHelper url,
string actionName,
string controllerName,
object routeValues = null)
{
string scheme = url.ActionContext.HttpContext.Request.Scheme;
return url.Action(actionName, controllerName, routeValues, scheme);
}
Dejando los detalles de cómo construirlo inyectando el accesor por si le resultan útiles a alguien. También podría estar interesado en la URL absoluta de la solicitud actual, en cuyo caso, eche un vistazo al final de la respuesta.
Puede modificar su clase de extensión para usar la IHttpContextAccessor
interfaz para obtener el HttpContext
. Una vez que tenga el contexto, entonces se puede obtener la HttpRequest
instancia de HttpContext.Request
y utilizar sus propiedades Scheme
, Host
, Protocol
etc, como en:
string scheme = HttpContextAccessor.HttpContext.Request.Scheme;
Por ejemplo, podría requerir que su clase esté configurada con un HttpContextAccessor:
public static class UrlHelperExtensions
{
private static IHttpContextAccessor HttpContextAccessor;
public static void Configure(IHttpContextAccessor httpContextAccessor)
{
HttpContextAccessor = httpContextAccessor;
}
public static string AbsoluteAction(
this IUrlHelper url,
string actionName,
string controllerName,
object routeValues = null)
{
string scheme = HttpContextAccessor.HttpContext.Request.Scheme;
return url.Action(actionName, controllerName, routeValues, scheme);
}
....
}
Que es algo que puede hacer en su Startup
clase (archivo Startup.cs):
public void Configure(IApplicationBuilder app)
{
...
var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
UrlHelperExtensions.Configure(httpContextAccessor);
...
}
Probablemente pueda encontrar diferentes formas de obtener el IHttpContextAccessor
en su clase de extensión, pero si desea mantener sus métodos como métodos de extensión al final, deberá inyectarlo IHttpContextAccessor
en su clase estática. (De lo contrario, necesitará IHttpContext
como argumento en cada llamada)
Recién obteniendo la Uri absoluta de la solicitud actual
Si solo desea obtener el uri absoluto de la solicitud actual, puede usar los métodos de extensión GetDisplayUrl
o GetEncodedUrl
de la UriHelper
clase. (Que es diferente del Ur L Helper)
GetDisplayUrl . Devuelve los componentes combinados de la URL de la solicitud en un formato sin escape (excepto para QueryString) adecuado solo para visualización. Este formato no debe usarse en encabezados HTTP u otras operaciones HTTP.
GetEncodedUrl . Devuelve los componentes combinados de la URL de la solicitud en un formato de escape completo adecuado para su uso en encabezados HTTP y otras operaciones HTTP.
Para utilizarlos:
- Incluya el espacio de nombres
Microsoft.AspNet.Http.Extensions
.
- Obtén la
HttpContext
instancia. Ya está disponible en algunas clases (como las vistas de maquinilla de afeitar), pero en otras es posible que deba inyectar un IHttpContextAccessor
como se explicó anteriormente.
- Entonces utilícelos como en
this.Context.Request.GetDisplayUrl()
Una alternativa a esos métodos sería crear manualmente el uri absoluto utilizando los valores en el HttpContext.Request
objeto (similar a lo que hace RequireHttpsAttribute ):
var absoluteUri = string.Concat(
request.Scheme,
"://",
request.Host.ToUriComponent(),
request.PathBase.ToUriComponent(),
request.Path.ToUriComponent(),
request.QueryString.ToUriComponent());