我正在与WCF合作,通过SOAP实现非常(非常)复杂的交互集(我们由一个从未听说过计算机的人控制的委员会交付)。我将收到一条如下信息:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
... (lots of "standard" stuff that noone has ever dared
to cobble together in such non-standard ways before)
</s:Header>
<s:Body>
<MyIncrediblyComplexXmlElement>
...
</MyIncrediblyComplexXmlElement>
</s:Body>
</s:Envelope>
...而且我不希望将正文内容解析为由xsd.exe
或svcutil.exe
创建的对象模型(这些工具是否甚至可以生成可以成功序列化的对象模型/反序列化这个特定的XML是一个激烈争论的问题)。我计划创建一个Message Contract来实现这些服务,我想知道我是否可以做类似以下的事情:
[ServiceContract(Namespace = "mynamespace")]
public interface IMyServiceInterface
{
[OperationContract(Action = "requestaction", ReplyAction = "replyaction")]
MyResponseMessage MyMethod(MyRequestMessage request);
}
[MessageContract(IsWrapped = false)]
public class MyRequestMessage
{
[MessageBodyMember(Namespace = "mynamespace", Order = 0)]
public XmlElement MyIncrediblyComplexXmlElement { get; set; }
}
[MessageContract(IsWrapped = false)]
public class MyResponseMessage
{
[MessageBodyMember(Namespace = "mynamespace", Order = 0)]
public XmlElement SomeResponseXmlElement { get; set; }
}
...然后直接操作XML,并在请求和响应消息中输出。这将极大地简化开发,因为我只需处理可能在消息中显示的XML的一小部分,并且我可以比生成的对象模型允许的更简单地使用它们。
这种模式(在消息合同中使用XmlElement
)是否适用于我的目的?如果没有,我如何实现直接使用XML的目标,而不必直接使用Message
个对象?
答案 0 :(得分:1)
可以使用XmlElement或XElement。它将把xsd:any放到WSDL中生成的消息描述中。如果您想避免对对象进行序列化和反序列化,那么就可以了,但在这种情况下,任何XML都可以到达。其他可能性是直接使用消息类型,但您已经拒绝它。
答案 1 :(得分:0)
您绝对可以编写Message检查器并将其插入WCF运行时,以便在将消息XML发送到服务器之前或在服务器端收到消息时对其进行操作。
查看MSDN docs on Message Inspectors或Pablo Pialorsi的blog post,了解更多提示。事情变得非常混乱和毛茸茸 - 但WCF运行时肯定会为您提供必要的钩子。这很好'不舒服?可能不是 - 但至少它是可能的,并且以文件的方式也是如此!