在我的 ASP.NET Core 2 应用程序中,每次序列化某种类型的对象(通过 JSON.NET)时,我都想在路径名字符串前面写入当前主机名。
对于此任务,我需要以某种方式将 HttpContext
注入(inject)到我的自定义 JsonConverter 中来捕获主人。但是,由于我无权访问 startup.cs ConfigureServices
中的 HttpContext
(转换器已注册到 MvcJsonOptions
), 我不知道如何将 HttpContext
注入(inject)我的 JsonConverter
。
最佳答案
您可以将服务 IHttpContextAccessor
注入(inject)转换器的构造函数。
类似下面的内容:
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 中的 ConfigureServices
中注册您的转换器时传递 HttpContextAccessor
服务
var httpContextAccessor = new HttpContextAccessor();
services.AddSingleton<IHttpContextAccessor>(httpContextAccessor);
services.AddJsonOptions(options => {
options.SerializerSettings.Converters.Add(new MyJsonConverter(httpContextAccessor));
});
请注意,您不应尝试在转换器的构造函数中访问 HttpContext
。在 write 或 read 方法中访问它,因为在上下文已经填充的请求期间很可能会调用它。
关于c# - 如何在 JsonConverter 中注入(inject)/访问 HttpContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50456180/