是否可以从WCF IDataContractSurrogate实现中读取请求标头?

时间:2009-02-09 01:18:45

标签: .net wcf web-services rest

我在RESTful service开发了WCF。我正在公开一个没有可序列化类型的合同,因此我使用DataContractSurrogate(IDataContractSurrogate的实现)来创建可以使用DataContractSerializer序列化的代理。

我的问题是,如何在DataContractSurrogate类中访问请求/响应标头?

在服务中,只需使用WebOperationContext即可,在客户端中可以在WebOperationContext对象的范围内访问相同的OperationContextScope,该对象可以通过引用当前对象来创建WCF频道(IContextChannel)。

如果我能够在OperatoinContextScope内获得对WCF频道的引用,我可以创建一个IDataContractSurrogate.GetDeserializedObject,但我不知道该怎么做。

有什么想法吗?


@casperOne
我想获取DataContractSurrogate实现中的标头值,因为要从代理项转换为目标类型,我需要引用工厂对象的单例池中的条目。

这样的事情:

SingletonFactoryPool.Factories[factoryIdFromHeader].CreateTargetType(surrogateValues);

由于其他原因,我已经在标题中传递了我需要的数据,如果我只是从标题中读取值,它似乎会更清晰。你的观点是有效的,我可以很容易地在代理中传递相同的数据。

1 个答案:

答案 0 :(得分:0)

如果您需要访问数据合同中的频道,我会说您的课程设计不正确。您的合同应该是自包含的,并且不依赖于通过通道传递消息时使用的标头值。

您总是可以创建一个扩展(您可以执行此操作的许多区域),这将使用反序列化的实例,然后向其添加您需要添加的标头信息。

当然,你总是可以创建一个单独的对象,它是反序列化实例的混合(通过参数传递)和头信息。