Після 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
аргумент для кожного виклику)
Просто отримуємо абсолютний Uri поточного запиту
Якщо ви просто хочете отримати абсолютний uri поточного запиту, ви можете використовувати методи розширення GetDisplayUrl
або GetEncodedUrl
з UriHelper
класу. (Що відрізняється від Ur L Helper)
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());