使用JsConfig.ExcludeTypeInfo时,ServiceStack会话不起作用

时间:2013-09-17 06:28:24

标签: c# session serialization servicestack

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

/api/auth/credentials进行身份验证时,所有内容都可以正常运行,但是当有安全网络服务请求时,GetSession()扩展方法无法从IAuthSession获取ICacheClient因为正在尝试要反序列化到接口(IAuthSession),在Redis中,由于JsConfig.ExcludeTypeInfo设置,JSON没有类型信息,因此序列化程序不知道要使用哪种具体类型。

1 个答案:

答案 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} }。

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