c# - 如何在 JsonConverter 中注入(inject)/访问 HttpContext?

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

在我的 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/

相关文章:

c# - 在没有回发的情况下在 asp.net 中上传文件

docker - 在docker下运行API时,Kibana中没有日志

c# - 简单注入(inject)器中 HttpConfiguration 的依赖注入(inject)

angularjs - 如何创建一个非单例的 Angular JS 服务?

c# - DropDownList 中的 ASP.NET Bind() - 字符串值与 Null

c# - 当 Control.Visible == false 时无法将数据绑定(bind)到控件

c# - 如何将列表转换为 C# 中的 observablecollection?

asp.net-core - 在 ASP.NET Core 2.0 中添加全局授权过滤器

c# - 添加简单的 TagHelper 会导致此错误 : "RenderBody has not been called for the page "

java - Spring Boot 中的分层 Bean 依赖