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
作为每次调用的参数)
只获取当前请求的absoluteUri
如果只想获取当前请求的绝对uri,可以使用扩展方法GetDisplayUrl
or GetEncodedUrl
来自UriHelper班级。 (这与乌尔LHelper)
获取显示网址。以完全未转义的形式返回请求 URL 的组合组件(QueryString 除外),仅适用于
用于显示。此格式不应在 HTTP 标头或其他标头中使用
HTTP 操作。
获取编码Url。以完全转义的形式返回请求 URL 的组合组件,适合在 HTTP 标头和其他内容中使用
HTTP 操作。
为了使用它们:
- 包含命名空间
Microsoft.AspNet.Http.Extensions
.
- Get the
HttpContext
实例。它已经在某些类(如剃刀视图)中可用,但在其他类中,您可能需要注入IHttpContextAccessor
如上所述。
- 然后就可以使用它们了
this.Context.Request.GetDisplayUrl()
这些方法的替代方法是使用中的值手动创建绝对 uriHttpContext.Request
对象(类似于需要Https属性 does):
var absoluteUri = string.Concat(
request.Scheme,
"://",
request.Host.ToUriComponent(),
request.PathBase.ToUriComponent(),
request.Path.ToUriComponent(),
request.QueryString.ToUriComponent());