在AppHost中我设置JsConfig.ExcludeTypeInfo=true;
以防止将类型序列化为响应(我在某些Web服务响应中使用匿名类型)。
对/api/auth/credentials
进行身份验证时,所有内容都可以正常运行,但是当有安全网络服务请求时,GetSession()
扩展方法无法从IAuthSession
获取ICacheClient
因为正在尝试要反序列化到接口(IAuthSession),在Redis中,由于JsConfig.ExcludeTypeInfo
设置,JSON没有类型信息,因此序列化程序不知道要使用哪种具体类型。
答案 0 :(得分:1)
如果您使用CustomAuthUserSession
并拥有
JsConfig.Init(new Config {
ExcludeTypeInfo = true
});
解决方案是为需要它的类型启用它,在这种情况下:
JsConfig<CustomAuthUserSession>.IncludeTypeInfo = true;
这种情况正在发生,因为ServiceStack允许您使用并保留自己的Custom UserSession,它需要将有效负载的 __ type 信息保留下来,以了解将其脱水的具体类型。
这是非常罕见的,因为当DTO可以支持保持任意类型时,我们只需要这样做,基本上在使用对象,接口或抽象属性时(即我们无法从类定义中推断出类型)。 ServiceStack中唯一存在的另一个地方是MQ Message<T>
类型,它允许持久化任意任意的主体。
默认情况下,ServiceStack仅在需要时添加添加的 __ type 信息,但理想情况下,您不应在服务响应中使用匿名类型,这需要偏离默认配置和{{3} }。
使用松散类型的数据结构(如Dictionary
或List
)对于非结构化数据是首选,因为匿名类型基本上会阻止您的DTO被反序列化,并阻止客户端最终了解服务的内容返回 - 这将破坏依赖于您的服务的任何东西是静态可推断的,例如的XSD / WSDL文件/ SOAP。