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

B12*_*ter 3 c# dependency-injection json.net asp.net-core asp.net-core-2.0

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

对于此任务,我需要以某种方式将其HttpContext注入我的自定义JsonConverter中以获取主机。然而,由于我没有访问HttpContextstartup.cs ConfigureServices(其中转换器注册到MvcJsonOptions),我不知道如何注入HttpContext到我的JsonConverter

Ism*_*sma 5

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

        //...
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在Startup.cs中HttpContextAccessor注册转换器时通过服务ConfigureServices

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

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