代码之家  ›  专栏  ›  技术社区  ›  Felix K.

如何在jsonConverter中注入/访问httpContext?

  •  2
  • Felix K.  · 技术社区  · 6 年前

    在我的ASP.NET核心2应用程序中,我希望每次序列化某个类型的对象时(通过json.net),在路径名字符串前面写入当前主机名。

    对于这个任务,我需要以某种方式注入 HttpContext 进入我的习惯 JsonConverter 抓住主人。但是,由于我无法访问 请求上下文 在内部 启动.cs ConfigureServices (转换器注册到 MvcJsonOptions )我不知道如何注射 请求上下文 进入我的 JsonConverter .

    1 回复  |  直到 6 年前
        1
  •  4
  •   Felix K.    6 年前

    你可以注入服务 IHttpContextAccessor 转换程序的构造函数。

    如下所示:

    public class MyJsonConverter : JsonConverter
    {
        private readonly IHttpContextAccessor httpContextAccessor;
    
        public MyJsonConverter(IHttpContextAccessor httpContextAccessor)
        {
            this.httpContextAccessor = httpContextAccessor;
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            var context = httpContextAccessor.HttpContext;
    
            //...
        }
    
        //...
    }
    

    然后你可以通过 HttpContextAccessor 在中注册转换器时的服务 ConfigureServices 在内部 启动.cs

    var httpContextAccessor = new HttpContextAccessor();
    services.AddSingleton<IHttpContextAccessor>(httpContextAccessor);
    services.AddJsonOptions(options => {
        options.SerializerSettings.Converters.Add(new MyJsonConverter(httpContextAccessor));
    });
    

    请注意,您不应尝试访问 HttpContext 在转换器的构造函数中。在写入或读取方法中访问它,因为在已经填充了上下文的请求期间很可能会调用该方法。