在 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 =&gt; opt.SerializerSettings.ContractResolver = new ContractResolver(httpContextAccessor); 中的httpContextAccessor来自哪里 好问题。我已经更新了上面的代码。 【参考方案1】:

我似乎已经解决了这个问题,根本不使用依赖注入,而是独立实例化 HttpContextAccessor,如下所示:

property.ShouldSerialize = p =>

   var request = new HttpContextAccessor().HttpContext?.Request;

   ...

【讨论】:

以上是关于在 Json 自定义 ContractResolver 的 ShouldSerialize 谓词中获取请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Chef 食谱中使用自定义 JSON 属性

如何在 JSON 中自定义编组映射键

如何在 package.json 中为包提供自定义 url

Chrome 扩展的 Manifest.json 中的自定义值?

如何在 webflux 中实现自定义身份验证管理器时对未经授权的请求响应自定义 json 正文

Ninja Framework 以自定义格式返回 JSON