在我的ASP.NET Core 2应用程序中,我想在每次某个类型的对象被序列化时(通过JSON.NET)在路径名字符串前写入当前主机名。
对于此任务,我需要以某种方式将HttpContext
注入我的自定义JsonConverter以获取主机。但是,因为我无法访问 startup.cs HttpContext
中的ConfigureServices
(转换器已注册到MvcJsonOptions
),所以我不会知道如何将HttpContext
注入我的JsonConverter
。
答案 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方法中访问它,因为很可能在已经填充了上下文的请求期间调用它。