直接访问ServiceModel层

时间:2011-01-04 21:48:07

标签: wcf

我是WCF的新手,如果我完全错过了这艘船,我会道歉。

WCF似乎为单独使用“Channel”层提供了大量功能。例如,要创建服务器,您可以从绑定创建一个通道侦听器并调用WaitForRequest,Reply等。这些方法都处理消息对象,因此您需要执行某些操作。消息。

我的问题与我们收到消息后发生的事情有关。假设我有一个实现服务的对象,由 ServiceContract 描述,而消息对象,我知道该对象代表对特定操作的调用。我真正想做的是:

Message requestMessage = GetMessageSomehow();
OperationDescription oc = GetContractForMessage();
Message replyMessage = Invoke(myService, oc, requestMessage);

至少,如果我可以以某种方式访问​​为类型创建的 IOperationInvoker IDispatchMessageFormatter 对象,将它们链接在一起以获取它将非常简单我正在寻找的功能。

在我的特定情况下,我需要实现一些简单的Soap 1.1和1.2服务(没有WS-Addressing)。我已经有了HttpListenerRequest / Response对象,并且可以基于SOAPAction或ContentType标头进行路由。

我认为拥有此功能对于单元测试也非常有用。例如,我需要实现现有客户端。如果我可以测试服务类上的属性是否正确(即我知道我将获得的消息被正确转换为我的服务接口上的调用),那将是很好的。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

从该Message实例到呼叫的实际参数的序列化/反序列化通常由IDispatchMessageFormatter / IClientMessageFormatter完成。

在服务器端,IDispatchMessageFormatter通过数据协定序列化程序(或其他序列化程序)插入的自定义操作行为注入DispatchRuntime。

但是......如果您没有使用ServiceHost,则没有DispatchRuntime。基本上,如果你想要所有这些,你将不得不自己做所有艰苦的工作:)

也就是说,如果你可以获得一个OperationDescription对象,你应该能够实例化一个DataContractSerializerOperationBehavior,但你将无法从中获取一个IDispatchMessageFormatter ......你可以获得一个XmlObjectSerializer,但是,哪些可能会或可能不会对您有用。

请注意,IOperationInvoker并没有那么多帮助,因为这假设你已经完成了消息序列化/反序列化,所以它实际上并不是那么有用(其余的功能对于基本用例来说相当简单,如果你想自己滚动它)