我需要创建一个模拟某些第三方服务的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>
答案 0 :(得分:0)
您可以使用“通用服务合同”在服务端完全跳过WCF反序列化:
[ServiceContract]
public interface IUniversalRequestResponseContract
{
[OperationContract(Action="*", ReplyAction="*")]
Message ProcessMessage(Message msg);
}
然后使用收到的Message实例处理反序列化。
如果您正在为测试目的编写一些外部服务的存根模拟(我猜),这是一种很好的方法,因为您可以准确控制响应中发送的内容。