如何在JsonConverter中注入/访问HttpContext?

时间:2018-05-21 20:28:27

标签: c# asp.net-core dependency-injection json.net asp.net-core-2.0

在我的ASP.NET Core 2应用程序中,我想在每次某个类型的对象被序列化时(通过JSON.NET)在路径名字符串前写入当前主机名。

对于此任务,我需要以某种方式将HttpContext注入我的自定义JsonConverter以获取主机。但是,因为我无法访问 startup.cs HttpContext中的ConfigureServices(转换器已注册到MvcJsonOptions),所以我不会知道如何将HttpContext注入我的JsonConverter

1 个答案:

答案 0 :(得分:4)

您可以将服务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;

        //...
    }

    //...
}

您可以在 Startup.cs

中的HttpContextAccessor注册转换器时传递ConfigureServices服务
var httpContextAccessor = new HttpContextAccessor();
services.AddSingleton<IHttpContextAccessor>(httpContextAccessor);
services.AddJsonOptions(options => {
    options.SerializerSettings.Converters.Add(new MyJsonConverter(httpContextAccessor));
});

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