2

在 AppHost 中,我正在设置JsConfig.ExcludeTypeInfo=true;以防止将类型序列化到响应中(我在某些 Web 服务响应中使用匿名类型)。

一切都可以正常进行身份验证,/api/auth/credentials但是当有对安全 Web 服务的请求时,GetSession()扩展方法无法获取IAuthSessionfrom,因为它试图反序列化到接口 (IAuthSession),并且在 Redis 中,由于设置ICacheClient,JSON 没有类型信息JsConfig.ExcludeTypeInfo所以序列化程序不知道要使用哪种具体类型。</p>

4

1 回答 1

2

如果你使用 aCustomAuthUserSession并且有

JsConfig.Init(new Config {
    ExcludeTypeInfo = true
});

解决方案是为需要它的类型启用它,在这种情况下:

JsConfig<CustomAuthUserSession>.IncludeTypeInfo = true;

发生这种情况是因为 ServiceStack 允许您使用并保留您自己的自定义 UserSession,它需要将__type信息与有效负载一起保留,以了解将其脱水为哪种具体类型。

支持任意响应

这是相当罕见的,因为我们只需要在 DTO 可以支持持有任意类型时才这样做,基本上是在使用对象、接口或抽象属性时(即我们无法从类定义中推断类型)。ServiceStack 中唯一存在的其他地方是 MQMessage<T>类型,它允许持久化任意主体。

使用松散类型的数据结构而不是匿名类型

默认情况下,ServiceStack 仅在需要时添加添加的__type信息,但理想情况下,您不应该在服务响应中使用匿名类型,这需要偏离默认配置和ServiceStack 鼓励的“成功坑”开发

使用松散类型的数据结构,例如DictionaryList首选非结构化数据作为匿名类型,基本上可以防止您的 DTO 被反序列化,并阻止客户了解服务最终返回的内容 - 这将破坏任何依赖于您的服务的东西静态可推断,例如 XSD/WSDL/SOAP。

于 2013-09-17T06:28:23.827 回答