Po RC2 i 1.0 nie musisz już wstrzykiwać sobie IHttpContextAccessorklasy rozszerzającej. Jest dostępna w IUrlHelperpoprzez urlhelper.ActionContext.HttpContext.Request. Następnie utworzyłbyś klasę rozszerzającą zgodnie z tym samym pomysłem, ale prostszą, ponieważ nie będzie wymagało wstrzyknięcia.
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);
}
Pozostawiając szczegóły, jak to zbudować, wstrzykując accesor na wypadek, gdyby były dla kogoś przydatne. Możesz być także zainteresowany bezwzględnym adresem URL bieżącego żądania, w takim przypadku spójrz na koniec odpowiedzi.
Możesz zmodyfikować swoją klasę rozszerzenia, aby używać IHttpContextAccessorinterfejsu do pobierania HttpContext. Gdy masz kontekst, a następnie można uzyskać HttpRequestinstancję od HttpContext.Requesti korzystać z jego właściwości Scheme, Host, Protocoletc jak w:
string scheme = HttpContextAccessor.HttpContext.Request.Scheme;
Na przykład możesz wymagać, aby Twoja klasa była skonfigurowana za pomocą 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);
}
....
}
Co możesz zrobić na swojej Startupklasie (plik Startup.cs):
public void Configure(IApplicationBuilder app)
{
...
var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
UrlHelperExtensions.Configure(httpContextAccessor);
...
}
Prawdopodobnie mógłbyś wymyślić różne sposoby uzyskania IHttpContextAccessorklasy rozszerzającej, ale jeśli chcesz zachować swoje metody jako metody rozszerzające, ostatecznie będziesz musiał wstrzyknąć the IHttpContextAccessordo swojej klasy statycznej. (W przeciwnym razie będziesz potrzebować IHttpContextjako argumentu przy każdym połączeniu)
Pobieram bezwzględneUri bieżącego żądania
Jeśli chcesz tylko uzyskać bezwzględny identyfikator URI bieżącego żądania, możesz użyć metod rozszerzających GetDisplayUrllub GetEncodedUrlz UriHelperklasy. (Co różni się od Ur L Helper)
GetDisplayUrl . Zwraca połączone składniki adresu URL żądania w postaci całkowicie bez zmiany znaczenia (z wyjątkiem QueryString), nadającej się tylko do wyświetlania. Tego formatu nie należy używać w nagłówkach HTTP ani w innych operacjach HTTP.
GetEncodedUrl . Zwraca połączone składniki adresu URL żądania w postaci pełnej zmiany znaczenia, odpowiedniej do użycia w nagłówkach HTTP i innych operacjach HTTP.
Aby z nich skorzystać:
- Uwzględnij przestrzeń nazw
Microsoft.AspNet.Http.Extensions.
- Pobierz
HttpContextinstancję. Jest już dostępny w niektórych klasach (takich jak widoki brzytwy), ale w innych może być konieczne wstrzyknięcie, IHttpContextAccessorjak wyjaśniono powyżej.
- Następnie użyj ich jak w
this.Context.Request.GetDisplayUrl()
Alternatywą dla tych metod byłoby ręczne utworzenie absolutnego URI przy użyciu wartości w HttpContext.Requestobiekcie (podobnie do tego, co robi RequireHttpsAttribute ):
var absoluteUri = string.Concat(
request.Scheme,
"://",
request.Host.ToUriComponent(),
request.PathBase.ToUriComponent(),
request.Path.ToUriComponent(),
request.QueryString.ToUriComponent());