После 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());