控制WCF消息正文序列化

时间:2010-12-15 16:36:09

标签: wcf serialization controls message


我需要创建一个模拟某些第三方服务的WCF服务。该服务有非常复杂的消息和包装器,因此我将在描述中简化它们 我有该服务的WSDL并创建了代理类。但这里出现了第一个问题:代理中的所有方法都有
    [System.ServiceModel.OperationContractAttribute(Action = "", ReplyAction = "*")] 因此,使用许多方法创建WCF服务是不可能的:每个方法都代理一个方法,因为每个方法都必须具有唯一的Action。我认为第三方服务有一种方法可以处理所有请求。我在RequestTypeBase和ResponceTypeBase上创建了需要KnownType属性的方法。所有代理类方法都有一个类型参数,派生自RequestTypeBase。 这是主要问题和问题:当WCF服务尝试反序列化邮件正文时,它会抛出一个异常,说预期的elementName是“Process”(处理所有请求的mega方法的名称)但现有的elementName是“RequestType1”(具有必须作为参数传递给“Process”方法的数据的名称类)。 那我怎么才能收到这样的消息? WCF中是否有一些属性不要求methodName作为Message体的根?如果他已经知道调用了什么方法,我甚至不明白WCF需要哪个MethodName呢?看起来像行动规范的冗余。

可能是WCF成功处理的简单MessabeBody示例,有助于理解我的意思:

<s:Body>
  <TestMethod xmlns="someNamespace">
    <x>1</x>
    <str>param2</str>
  </TestMethod>
</s:Body>

1 个答案:

答案 0 :(得分:0)

您可以使用“通用服务合同”在服务端完全跳过WCF反序列化:

[ServiceContract]
public interface IUniversalRequestResponseContract
{
    [OperationContract(Action="*", ReplyAction="*")]
    Message ProcessMessage(Message msg);
}

然后使用收到的Message实例处理反序列化。

如果您正在为测试目的编写一些外部服务的存根模拟(我猜),这是一种很好的方法,因为您可以准确控制响应中发送的内容。