Nach RC2 und 1.0 müssen Sie IHttpContextAccessor
Ihrer Erweiterungsklasse keine Erweiterungsklasse mehr hinzufügen. Es ist sofort in der IUrlHelper
durch 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 IHttpContextAccessor
Schnittstelle zum Abrufen der zu verwenden HttpContext
. Sobald Sie den Kontext haben, dann können Sie die bekommen HttpRequest
Instanz aus HttpContext.Request
und verwenden seine Eigenschaften Scheme
, Host
, Protocol
usw. , 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 Startup
Klasse 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 IHttpContextAccessor
in Ihrer Erweiterungsklasse zu erhalten, aber wenn Sie Ihre Methoden am Ende als Erweiterungsmethoden beibehalten möchten, müssen Sie die IHttpContextAccessor
in Ihre statische Klasse einfügen. (Andernfalls benötigen Sie das IHttpContext
als 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 GetDisplayUrl
oder GetEncodedUrl
die UriHelper
Klasse 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
HttpContext
Instanz. Es ist bereits in einigen Klassen verfügbar (z. B. in Rasiereransichten), in anderen müssen Sie möglicherweise eine injizieren, IHttpContextAccessor
wie 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.Request
Objekt (ähnlich wie beim RequireHttpsAttribute ):
var absoluteUri = string.Concat(
request.Scheme,
"://",
request.Host.ToUriComponent(),
request.PathBase.ToUriComponent(),
request.Path.ToUriComponent(),
request.QueryString.ToUriComponent());