Po RC2 i 1.0 nie musisz już wstrzykiwać sobie IHttpContextAccessor
klasy rozszerzającej. Jest dostępna w IUrlHelper
poprzez 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ć IHttpContextAccessor
interfejsu do pobierania HttpContext
. Gdy masz kontekst, a następnie można uzyskać HttpRequest
instancję od HttpContext.Request
i korzystać z jego właściwości Scheme
, Host
, Protocol
etc 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 Startup
klasie (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 IHttpContextAccessor
klasy rozszerzającej, ale jeśli chcesz zachować swoje metody jako metody rozszerzające, ostatecznie będziesz musiał wstrzyknąć the IHttpContextAccessor
do swojej klasy statycznej. (W przeciwnym razie będziesz potrzebować IHttpContext
jako 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 GetDisplayUrl
lub GetEncodedUrl
z UriHelper
klasy. (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
HttpContext
instancję. Jest już dostępny w niektórych klasach (takich jak widoki brzytwy), ale w innych może być konieczne wstrzyknięcie, IHttpContextAccessor
jak 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.Request
obiekcie (podobnie do tego, co robi RequireHttpsAttribute ):
var absoluteUri = string.Concat(
request.Scheme,
"://",
request.Host.ToUriComponent(),
request.PathBase.ToUriComponent(),
request.Path.ToUriComponent(),
request.QueryString.ToUriComponent());