Після 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());