【问题标题】:Is it possible to read request headers from WCF IDataContractSurrogate implementation?是否可以从 WCF IDataContractSurrogate 实现中读取请求标头?
【发布时间】:2009-02-09 01:18:45
【问题描述】:

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

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

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

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

有什么想法吗?


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

类似这样的:

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

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

【问题讨论】:

    标签: .net wcf web-services rest


    【解决方案1】:

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

    你总是可以创建一个扩展(有很多地方你可以这样做),它将获取反序列化的实例,然后向其中添加你需要添加的标头信息。

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

    【讨论】:

    • 更新了帖子,进一步澄清了我为什么要访问 IDataContractSurrogate 实现中的标头。回复是很长的评论
    猜你喜欢
    • 2020-02-21
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2016-03-18
    • 2013-09-23
    • 2021-01-12
    相关资源
    最近更新 更多