我试图找出如何从.Net Core 1.1中的用户类访问当前绝对Uri-即当前正在呈现的 View 的绝对URL

我找到了此链接,但它似乎已过时,并在错误后引发错误:Getting absolute URLs using ASP.NET Core MVC 6

在我的Startup.cs中,在ConfigureServices下:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

在我的Startup.cs中,在“配置”下:
IHttpContextAccessor httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
Extensions.Context.Configure(httpContextAccessor);

我有以下类(class):
using Microsoft.AspNetCore.Http;
using System;

namespace Framework.Extensions
{
    public static class Context
    {
        private static IHttpContextAccessor HttpContextAccessor;
        public static void Configure(IHttpContextAccessor httpContextAccessor)
        {
            HttpContextAccessor = httpContextAccessor;
        }

        private static HttpContext GetCurrentContext()
        {
            return HttpContextAccessor.HttpContext;
        }
        public static HttpContext Current = GetCurrentContext();

        private static Uri GetAbsoluteUri()
        {
            UriBuilder uriBuilder = new UriBuilder();
            uriBuilder.Scheme = GetCurrentContext().Request.Scheme;
            uriBuilder.Host = GetCurrentContext().Request.Host.ToString();
            uriBuilder.Path = GetCurrentContext().Request.Path.ToString();
            uriBuilder.Query = GetCurrentContext().Request.QueryString.ToString();
            return uriBuilder.Uri;
        }
        public static Uri AbsoluteUri = GetAbsoluteUri();
        public static string Url = GetAbsoluteUri().ToString();
        public static string AbsolutePath = GetAbsoluteUri().AbsolutePath;
    }
}

我得到以下异常:

最佳答案

您希望在IHttpContextAccessor中“配置或注入(inject)” Startup,以便稍后在请求上下文中使用帮助器时,可以使用它来访问当前的HttpContext对象。

您不能将上下文存储在静态字段中,因为该上下文仅在满足特定请求时才有意义。通常,您将访问器保留在静态字段中,并在每次调用助手时使用它。

  • 更糟糕的是,您将静态字段与初始化程序一起使用,这些初始化程序在首次使用该类时执行。这意味着它们将在调用Configure方法之前立即执行,因此将没有IHttpContextAccessor进行配置,并且您将获得这些空引用。

  • 这将是编写所需内容的简单操作:
    public static class Context
    {
        private static IHttpContextAccessor HttpContextAccessor;
        public static void Configure(IHttpContextAccessor httpContextAccessor)
        {
            HttpContextAccessor = httpContextAccessor;
        }
    
        private static Uri GetAbsoluteUri()
        {
            var request = HttpContextAccessor.HttpContext.Request;
            UriBuilder uriBuilder = new UriBuilder();
            uriBuilder.Scheme = request.Scheme;
            uriBuilder.Host = request.Host.Host;
            uriBuilder.Path = request.Path.ToString();
            uriBuilder.Query = request.QueryString.ToString();
            return uriBuilder.Uri;
        }
    
        // Similar methods for Url/AbsolutePath which internally call GetAbsoluteUri
        public static string GetAbsoluteUrl() { }
        public static string GetAbsolutePath() { }
    }
    

    还有一点要牢记:
  • 在最初的问题中,因为辅助程序是作为扩展方法创建的,所以该帮助程序被创建为静态类。如果不使用扩展方法,则不必强制使用静态类。
  • 07-24 09:22