JsonSerializer每个请求上下文
问题描述:
我必须应用不同的序列化规则,这取决于http请求上的上下文传递。我认为最简洁的方法是使用JsonConverter来完成这项工作,该工具将从我的应用程序的启动中挂钩。JsonSerializer每个请求上下文
class MyJsonConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var context = serializer.Context;
...
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var context = serializer.Context;
...
}
public override bool CanConvert(Type objectType)
{
...
}
}
//in the startup i am just registering this converter by
config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings
{
Converters = new List<JsonConverter>()
{
new MyJsonConverter()
}
};
的问题是在这一点上我的期望是让serializer.Context
是我的要求的情况下。但实际上是空的。
我怎样才能使这个设置在每个请求的基础上,所以我可以在转换器上使用它?有没有可能在asp.net级别做到这一点?或者可能使用autofac来解决它?
答
首先,你要的NuGet包 “Autofac.Integration.Mvc”
那么你可以添加.InstancePerHttpRequest()安装到您的注册 https://autofac.org/apidoc/html/CE22CC19.htm
其次,在你注册,你会有这样的东西
builder.Register(c => new JsonSerializer(config.Formatters.JsonFormatter.SerializerSettings)).InstancePerHttpRequest().As<JsonSerializer>();
lamda将执行每个HttpRequest并给你当前的上下文,假设你可以检索它。
您需要修改代码以在构造函数中使用JsonSerializer,而不是每种方法。这将触发autofac为每个HttpRequest提供一个新实例。你的代码现在看起来像这样...
class MyJsonConverter : JsonConverter
{
private readonly JsonSerializer _serializer;
public MyJsonConverter(JsonSerializer serializer)
{
_serializer = serializer;
}
public override void WriteJson(JsonWriter writer, object value)
{
var context = _serializer.Context;
...
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue)
{
var context = _serializer.Context;
...
}
public override bool CanConvert(Type objectType)
{
...
}
}
@rateus,谢谢你的回答。我不清楚一件事。与SerializerSettings实际上一样,Serialising设置的实例在启动配置时完成,因此只有一个实例。我正在考虑是否在转换器中使用'JsonSerializer.Context'来解决每个请求的上下文。 – Kanekotic
@Kanekotic我已经更新了我的答案,我认为你需要,我一开始并不知道你使用的是NewtonSoft Json – raterus