在 Json 自定义 ContractResolver 的 ShouldSerialize 谓词中获取请求
Posted
技术标签:
【中文标题】在 Json 自定义 ContractResolver 的 ShouldSerialize 谓词中获取请求【英文标题】:Obtain request inside ShouldSerialize predicate of Json Custom ContractResolver 【发布时间】: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
来自哪里
好问题。我已经更新了上面的代码。
【参考方案1】:
我似乎已经解决了这个问题,根本不使用依赖注入,而是独立实例化 HttpContextAccessor,如下所示:
property.ShouldSerialize = p =>
var request = new HttpContextAccessor().HttpContext?.Request;
...
【讨论】:
以上是关于在 Json 自定义 ContractResolver 的 ShouldSerialize 谓词中获取请求的主要内容,如果未能解决你的问题,请参考以下文章
Chrome 扩展的 Manifest.json 中的自定义值?