关于缺少属性的 ServiceStack AutoQuery 警告

Posted

技术标签:

【中文标题】关于缺少属性的 ServiceStack AutoQuery 警告【英文标题】:ServiceStack AutoQuery warning about missing property 【发布时间】:2021-10-25 10:17:36 【问题描述】:

当我查询 AutoQuery 服务(常规 GET 请求)时,我会在日志中收到警告,即使请求工作正常。警告如下所示,对于 URL:https://localhost:5001/employees?BirthDate%3E=1950-01-01

info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 GET https://localhost:5001/employees?BirthDate%3E=1950-01-01 - -
warn: ServiceStack.Serialization.StringMapTypeDeserializer[0]
      Property 'birthdate>' does not exist on type 'autoquery.ServiceModel.AutoQueries+QueryEmployee'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished HTTP/2 GET https://localhost:5001/employees?BirthDate%3E=1950-01-01 - - - 200 - text/html 291.5297ms

我创建了一个示例,使用 Northwind 数据库,我使用x mix northwind.sqlite 和来自官方示例的 DTO:https://github.com/ServiceStackApps/Northwind/blob/master/src/Northwind/Northwind.ServiceModel/Types/Employee.cs。

这个“错误警告”有点麻烦,因为没有任何问题,而且它会在我的日志中填满我需要忽略的警告。特别是因为我已经在日志中为 WARN+ERR 设置了警报。

我在这里工作示例:https://github.com/specimen151/autoquerywarning

【问题讨论】:

【参考方案1】:

在使用 AutoQuery's Implicit Contentions 时会出现这种情况,其中会记录警告,因为请求被发送到没有匹配请求 DTO 属性的 API。

您可以添加 BirthDate 作为 AutoQuery DTO 的类型化属性,也可以忽略所有“BirthDate”属性:

SetConfig(new HostConfig 
    IgnoreWarningsOnPropertyNames =  "BirthDate" 
);

或者您可以禁用所有缺少的属性警告:

SetConfig(new HostConfig 
    IgnoreWarningsOnAllProperties = true
);

在最新的 v5.12.1 中,现在是 available on MyGet ServiceStack 默认将不再警告 AutoQuery DTO 上缺少属性,它可以通过以下方式重新启用:

SetConfig(new HostConfig 
    IgnoreWarningsOnAutoQueryApis = false
);

【讨论】:

嗯。不想忽略所有属性警告,因为其中一些可能是真正的问题,可能与自定义 DTO 有关。通常忽略每个 DTO 上的属性名称(例如 BirthDate)具有相同的问题。我可以将底层 DTO 的所有属性显式添加到 AutoQuery 对象(继承会起作用吗?),这只是有点麻烦,不会给你知道的良好的“AutoQuery 感觉”。如果没有为这些确实存在(尽管是动态的)且有问题的属性给出警告,则首选解决方案。 @specimen 我建议在开发期间使用隐式约定,但为您在生产中使用的所有属性查询添加类型化属性。 我测试了添加属性:public class QueryEmployee : QueryDb<Employee> public DateTime? BirthDate get; set; ,但我仍然收到警告:Property 'birthdate>' does not exist on type 'autoquery.ServiceModel.AutoQueries+QueryEmployee' @specimen FYI ServiceStack 将不再警告默认情况下来自 latest v5.12.1 on MyGet 的 AutoQuery API 上缺少属性 如果有人阅读这些 cmets:查看从我发布错误报告/功能请求(无论您如何查看)到我得到第一个答案的时间戳,然后是 cmets 中的时间戳,以及最终更新框架代码的时间戳。惊人的!再加上我在 UTC+1 时区,这意味着我在纽约时间 05:50 发布了我的问题(我认为 SS 所在的位置)。

以上是关于关于缺少属性的 ServiceStack AutoQuery 警告的主要内容,如果未能解决你的问题,请参考以下文章

关于ServiceStack.Redis的一些问题

ServiceStack Json Serializer 忽略属性

ServiceStack.Redis:PooledRedisClientManager和RedisManagerPool等待上一请求完成

ServiceStack.Redis之IRedisClient 03_转

ServiceStack.OrmLite 调用存储过程

ServiceStack 并返回一个流