Nach RC2 und 1.0 müssen Sie IHttpContextAccessorIhrer Erweiterungsklasse keine Erweiterungsklasse mehr hinzufügen. Es ist sofort in der IUrlHelperdurch dieurlhelper.ActionContext.HttpContext.Request . Sie würden dann eine Erweiterungsklasse erstellen, die der gleichen Idee folgt, jedoch einfacher ist, da keine Injektion erforderlich ist.
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);
}
Lassen Sie die Details darüber, wie man es baut, und injizieren Sie den Zugang, falls sie für jemanden nützlich sind. Möglicherweise interessiert Sie auch nur die absolute URL der aktuellen Anfrage. In diesem Fall sehen Sie sich das Ende der Antwort an.
Sie können Ihre Erweiterungsklasse ändern, um die IHttpContextAccessorSchnittstelle zum Abrufen der zu verwenden HttpContext. Sobald Sie den Kontext haben, dann können Sie die bekommen HttpRequestInstanz aus HttpContext.Requestund verwenden seine Eigenschaften Scheme, Host, Protocolusw. , wie in:
string scheme = HttpContextAccessor.HttpContext.Request.Scheme;
Beispielsweise könnte es erforderlich sein, dass Ihre Klasse mit einem HttpContextAccessor konfiguriert wird:
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);
}
....
}
Was können Sie in Ihrer StartupKlasse tun (Startup.cs-Datei):
public void Configure(IApplicationBuilder app)
{
...
var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
UrlHelperExtensions.Configure(httpContextAccessor);
...
}
Sie könnten wahrscheinlich verschiedene Möglichkeiten finden, um die IHttpContextAccessorin Ihrer Erweiterungsklasse zu erhalten, aber wenn Sie Ihre Methoden am Ende als Erweiterungsmethoden beibehalten möchten, müssen Sie die IHttpContextAccessorin Ihre statische Klasse einfügen. (Andernfalls benötigen Sie das IHttpContextals Argument bei jedem Aufruf)
Nur das absoluteUri der aktuellen Anfrage erhalten
Wenn Sie nur die absolute URL der aktuellen Anforderung abrufen möchten, können Sie die Erweiterungsmethoden GetDisplayUrloder GetEncodedUrldie UriHelperKlasse verwenden. (Was sich vom Ur L Helper unterscheidet)
GetDisplayUrl . Gibt die kombinierten Komponenten der Anforderungs-URL in einer vollständig nicht maskierten Form (mit Ausnahme des QueryString) zurück, die nur zur Anzeige geeignet ist. Dieses Format sollte nicht in HTTP-Headern oder anderen HTTP-Vorgängen verwendet werden.
GetEncodedUrl . Gibt die kombinierten Komponenten der Anforderungs-URL in einer vollständig maskierten Form zurück, die für die Verwendung in HTTP-Headern und anderen HTTP-Vorgängen geeignet ist.
Um sie zu verwenden:
- Fügen Sie den Namespace ein
Microsoft.AspNet.Http.Extensions.
- Holen Sie sich die
HttpContextInstanz. Es ist bereits in einigen Klassen verfügbar (z. B. in Rasiereransichten), in anderen müssen Sie möglicherweise eine injizieren, IHttpContextAccessorwie oben erläutert.
- Dann benutze sie einfach wie in
this.Context.Request.GetDisplayUrl()
Eine Alternative zu diesen Methoden wäre das manuelle Erstellen des absoluten Uri mithilfe der Werte im HttpContext.RequestObjekt (ähnlich wie beim RequireHttpsAttribute ):
var absoluteUri = string.Concat(
request.Scheme,
"://",
request.Host.ToUriComponent(),
request.PathBase.ToUriComponent(),
request.Path.ToUriComponent(),
request.QueryString.ToUriComponent());