После RC2 и 1.0 вам больше не нужно вводить IHttpContextAccessorкласс расширения. Он сразу же доступен в IUrlHelperформате urlhelper.ActionContext.HttpContext.Request. Затем вы должны создать класс расширения, следуя той же идее, но более простой, поскольку не будет задействована инъекция.
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);
}
Оставив подробности о том, как его построить, вводя аксессуар на случай, если они кому-то пригодятся. Вам также может быть интересен абсолютный URL-адрес текущего запроса, и в этом случае посмотрите в конец ответа.
Вы можете изменить свой класс расширения, чтобы использовать IHttpContextAccessorинтерфейс для получения HttpContext. Если у вас есть контекст, то вы можете получить HttpRequestэкземпляр из HttpContext.Requestи использовать его свойство Scheme, Host, и Protocolт.д. , как в:
string scheme = HttpContextAccessor.HttpContext.Request.Scheme;
Например, вы можете потребовать, чтобы ваш класс был настроен с 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);
}
....
}
Это то, что вы можете сделать в своем Startupклассе (файл Startup.cs):
public void Configure(IApplicationBuilder app)
{
...
var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
UrlHelperExtensions.Configure(httpContextAccessor);
...
}
Вероятно, вы могли бы придумать разные способы получения IHttpContextAccessorв своем классе расширения, но если вы хотите сохранить свои методы как методы расширения, в конце вам нужно будет ввести IHttpContextAccessorв свой статический класс. (В противном случае вам понадобится в IHttpContextкачестве аргумента при каждом вызове)
Просто получаю absoluteUri текущего запроса
Если вы просто хотите получить абсолютный uri текущего запроса, вы можете использовать методы расширения GetDisplayUrlили GetEncodedUrlиз UriHelperкласса. (Который отличается от помощника Ur L )
GetDisplayUrl . Возвращает объединенные компоненты URL-адреса запроса в полностью неэкранированной форме (за исключением QueryString), подходящей только для отображения. Этот формат не следует использовать в заголовках HTTP или других операциях HTTP.
GetEncodedUrl . Возвращает объединенные компоненты URL-адреса запроса в полностью экранированной форме, подходящей для использования в заголовках HTTP и других операциях HTTP.
Чтобы их использовать:
- Включите пространство имен
Microsoft.AspNet.Http.Extensions.
- Получите
HttpContextэкземпляр. Он уже доступен в некоторых классах (например, в представлениях бритвы), но в других вам может потребоваться ввести, IHttpContextAccessorкак описано выше.
- Тогда просто используйте их как в
this.Context.Request.GetDisplayUrl()
Альтернативой этим методам было бы вручную создать абсолютный uri, используя значения в HttpContext.Requestобъекте (аналогично тому, что делает RequireHttpsAttribute ):
var absoluteUri = string.Concat(
request.Scheme,
"://",
request.Host.ToUriComponent(),
request.PathBase.ToUriComponent(),
request.Path.ToUriComponent(),
request.QueryString.ToUriComponent());