【发布时间】:2021-11-29 19:42:09
【问题描述】:
我需要在 property.ShouldSerialize 函数的谓词中获取当前请求上下文查询字符串。我正在使用 .net 5.0。
我目前正在这样注入 HttpContext:
public MyContractResolver(IHttpContextAccessor httpContextAccessor)
并尝试这样访问它:
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var request = this._httpContextAccessor.HttpContext.Request;
property.ShouldSerialize = p =>
{
query = request.(get stuff I need)
}
}
我正在 Startup 中注册解析器:
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpContextAccessor();
services.AddNewtonsoftJson(opt =>
{
IServiceProvider container = services.BuildServiceProvider();
var httpContextAccessor = container.GetService<IHttpContextAccessor>();
opt.SerializerSettings.ContractResolver = new ContractResolver(httpContextAccessor);
}
}
这对于第一个请求很好,但是后续请求失败并出现错误:
System.ObjectDisposedException
HResult=0x80131622
Message=IFeatureCollection has been disposed.
这实际上是有道理的,因为在启动时创建的原始 HttpContext 已被释放(我相信在启动时它们仅适用于该函数)
但是,我需要检查未来请求的请求信息,因为查询字符串可能已更改。到目前为止,让它工作的唯一方法是在每个请求上创建合同,这并不理想,因为它有很多开销。
【问题讨论】:
-
传递给构造函数的参数
httpContextAccessor从何而来? -
services.AddHttpContextAccessor();在启动期间将 HttpContextAccessor 注册为单例,因此可以通过依赖注入获得。
-
是的,但这不是我的问题。我在问注册码
services.AddNewtonsoftJson(opt => { opt.SerializerSettings.ContractResolver = new ContractResolver(httpContextAccessor); }中的httpContextAccessor来自哪里 -
好问题。我已经更新了上面的代码。
标签: c# json .net asp.net-core c#-5.0