无法从IDataContractSurrogate的实现中访问服务实例

时间:2014-06-03 14:20:57

标签: wcf

这是我的第一篇文章,我真的很努力地找到答案,但到目前为止我还是一片空白。

我对IDataContractSurrogate的实现为我维护的某些“缓存”对象创建了代理(这很好)。不起作用的是,为了使该系统有效地运行,它需要访问服务实例以获得与其客户端的交互所维护的实例的某些属性。此外,当我的IDataContractSurrogate实现在其“客户端模式”下工作时,它需要以类似的方式访问客户端实例的属性。从客户端和服务实例访问信息会影响我创建代理类型的方式(或者,如果我能回答这个问题,我应该这样做!)

我的服务实例是PerSession并发。

在服务器端,对GetDataContractType和GetDeserializedObject的调用包含一个有效的OperationContext.Current,我当然可以从中检索服务实例。但是在客户端,没有一个调用产生OperationContext.Current。我们仍然在进行操作,因为我将代理类型转换为数据协定类型,之后它们已从服务器发送,作为对客户端请求的响应的一部分,所以我原本期望一个?也许从Operation调用之外使用OperationContext.Current的整个想法是错误的?

因此,继续前进,并尝试解决此问题,我已经检查了应用我的客户行为时可用的clientRuntime / dispatchRuntime对象,但是这似乎并没有给我任何形式的客户端实例访问权限,除非我可能有一个消息引用...然后调用InstanceProvider。但是我没有这条消息。

我的另一个想法是自己使用IInstanceProvider,然后可能会建立一个所有被抛出的字典...但这并不好,因为我似乎无法访问任何与会话相关的信息从我在IDataContractSurrogate的实现中用作字典键。

我最初实现了自己的序列化程序,但这不是我想要的。我对内置的序列化程序感到满意,将对象更改为特殊代理是完全我需要做的事情,还有额外的好处,即每个子属性都会进行检查。

我还考虑过应用服务行为,但这似乎也不会产生服务实例,也不允许我设置Surrogate实现属性。

我根本不知道如何从我的实现IDataContractSurrogate中获取对当前会话/实例的访问权限。任何帮助将不胜感激。

非常感谢,

肖恩

1 个答案:

答案 0 :(得分:0)

我已经解决了我的问题。简短的回答是我实现了IClientMessageFormatter和IDispatchMessageFormatter来完成我需要的工作。在SerializeReply内部,我总是可以访问ServiceInstance,因为OperationContext.Current是有效的。由于我必须实现自己的序列化和反序列化,这是更多的工作,但是完美无缺。剩下的唯一问题是没有办法获得处理响应的客户端代理,但到目前为止这对我来说并不是一个显示阻止。

相关问题