【问题标题】:How to get FULL URL in ASP.NET Core Razor Pages?如何在 ASP.NET Core Razor 页面中获取完整的 URL?
【发布时间】:2022-01-25 19:31:51
【问题描述】:

我想获得完整网址,而不仅仅是Path,不仅仅是Query,也不是RouteValues

原始形式的整个 URL。

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

【问题讨论】:

    标签: c# asp.net asp.net-core razor-pages


    【解决方案1】:

    您可以使用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();
    

    【讨论】:

      【解决方案2】:

      您可以创建一个扩展类来使用 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 作为每次调用的参数)

      【讨论】:

        【解决方案3】:

        您可以尝试使用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;
        

        【讨论】:

          【解决方案4】:

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

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

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

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

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

          【讨论】:

            猜你喜欢
            • 2018-06-15
            • 1970-01-01
            • 2022-01-19
            • 2021-10-27
            • 2019-09-03
            • 1970-01-01
            • 2021-07-06
            • 2010-09-07
            • 2022-06-28
            相关资源
            最近更新 更多