如何在 ASP.NET 核心 Razor 页面中获得完整的 URL?

How to get FULL URL in ASP.NET Core Razor Pages?

我想要完整的URL,而不仅仅是Path,不仅仅是Query,而不是[=14] =].

整个 URL 以原始形式出现。

如何在 ASP.NET Core Razor Pages 中做到这一点?

您可以使用 IUrlHelperPageLink 方法获取页面的绝对值 URL。

在页面处理程序中,IUrlHelper 可以通过 Url 属性:

访问
public async Task<IActionResult> OnPostAsync()
{
    string url = Url.PageLink("/PageName", "PageHandler", routeValues);
    ...
}

如果要为控制器操作生成 URL,请使用 ActionLink

适用于 ASP.NET Core 3.0 及更高版本。

您可以使用 UriHelper 扩展方法 GetDisplayUrl()GetEncodedUrl() 从请求中获取完整的 URL。

GetDisplayUrl()

Returns the combined components of the request URL in a fully un-escaped form (except for the QueryString) suitable only for display. This format should not be used in HTTP headers or other HTTP operations.

GetEncodedUrl()

Returns the combined components of the request URL in a fully escaped form suitable for use in HTTP headers and other HTTP operations.

用法:

using Microsoft.AspNetCore.Http.Extensions;
...
string url = HttpContext.Request.GetDisplayUrl();
// or
string url = HttpContext.Request.GetEncodedUrl();

您可以创建扩展 class 以使用 IHttpContextAccessor 接口获取 HttpContext。一旦有了上下文,就可以从 HttpContext.Request 获取 HttpRequest 实例并使用其属性 Scheme、Host、Protocol 等,如:

string scheme = HttpContextAccessor.HttpContext.Request.Scheme;

例如,您可能需要为 class 配置 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 class(Startup.cs 文件)中执行以下操作:

public void Configure(IApplicationBuilder app)
{
    ...

    var httpContextAccessor = 
        app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
        UrlHelperExtensions.Configure(httpContextAccessor);

    ...
}

您可能会想出不同的方法在您的扩展程序中获取 IHttpContextAccessor class,但是如果您希望最终将您的方法保留为扩展方法,您将需要将 IHttpContextAccessor 注入到您的静态文件中class。 (否则您将需要 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;