【发布时间】:2022-01-25 19:31:51
【问题描述】:
我想获得完整网址,而不仅仅是Path,不仅仅是Query,也不是RouteValues。
原始形式的整个 URL。
如何在 ASP.NET Core Razor 页面中做到这一点?
【问题讨论】:
标签: c# asp.net asp.net-core razor-pages
我想获得完整网址,而不仅仅是Path,不仅仅是Query,也不是RouteValues。
原始形式的整个 URL。
如何在 ASP.NET Core Razor 页面中做到这一点?
【问题讨论】:
标签: c# asp.net asp.net-core razor-pages
您可以使用UriHelper 扩展方法GetDisplayUrl() 或GetEncodedUrl() 从请求中获取完整的URL。
GetDisplayUrl()
返回组合的组件 以完全未转义的形式请求 URL(QueryString 除外) 只适合展示。此格式不应在 HTTP 中使用 标头或其他 HTTP 操作。
GetEncodedUrl()
返回组合的组件 以完全转义的形式请求 URL,适用于 HTTP 标头 和其他 HTTP 操作。
用法:
using Microsoft.AspNetCore.Http.Extensions;
...
string url = HttpContext.Request.GetDisplayUrl();
// or
string url = HttpContext.Request.GetEncodedUrl();
【讨论】:
您可以创建一个扩展类来使用 IHttpContextAccessor 接口来获取 HttpContext。获得上下文后,您可以从 HttpContext.Request 获取 HttpRequest 实例并使用其属性 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 作为每次调用的参数)
【讨论】:
您可以尝试使用HttpContext.Request.Scheme + HttpContext.Request.Host获取https://localhost:xxxx,然后使用HttpContext.Request.Path + HttpContext.Request.QueryString获取路径和查询:
var request = HttpContext.Request;
var _baseURL = $"{request.Scheme}://{request.Host}";
var fullUrl = _baseURL+HttpContext.Request.Path + HttpContext.Request.QueryString;
【讨论】:
您可以使用IUrlHelper 的PageLink 方法获取页面的绝对URL。
在页面处理程序中,IUrlHelper 可以通过Url 属性访问:
public async Task<IActionResult> OnPostAsync()
{
string url = Url.PageLink("/PageName", "PageHandler", routeValues);
...
}
如果要生成控制器操作的 URL,请使用 ActionLink。
适用于 ASP.NET Core 3.0 及更高版本。
【讨论】: