如何拦截WCF类的创建

时间:2009-11-30 19:22:25

标签: .net wcf dynamic-proxy

我有一个wcf服务,我没有使用服务引用。 类和接口在客户端服务器引用的dll中定义。 与服务器的通信使用从ClientBase派生的类。

我想在客户端拦截wcf的默认对象创建,这样我就可以提供一个实现INotifyPropertyChanged的子类型(由城堡动态代理创建)。

基本上{/ 3}}背后的想法仅适用于wcf。

4 个答案:

答案 0 :(得分:1)

我不完全理解你要做什么 - 你想从服务器发送一个POCO到客户端:这意味着,你需要创建那个POCO类并将其装饰为[DataContract],并装饰它您希望使用[DataMember]序列化的成员。

在客户端,您将获得一个生成的客户端代理类,它具有相同的序列化有线格式 - 但由于WCF使用XML模式进行序列化作为最小公分母,因此您无法发送诸如接口之类的东西等等 - 只有具体的实例类。在客户端上,您没有获得与服务器上相同的类 - 只是具有相同“外观和感觉”(和序列化格式)的类。

所以我真的不知道你想要如何以及在哪里挂钩。

您可能要做的一件事是基于

创建一个客户端消息检查器
public interface IClientMessageInspector
{
    void AfterReceiveReply(ref Message reply, object correlationState);
    object BeforeSendRequest(ref Message request, IClientChannel channel);
}

将捕获“AfterReceiveReply”事件,然后你将把序列化的POCO类转换为线路,并将其转换为另一个类,它也将实现INotifyPropertyChanged处理程序。

请参阅一些有关如何在WCF中编写和处理Message检查器的博客文章:

答案 1 :(得分:0)

您是在谈论拦截来自ChannelFactory的CreateChannel旋转的对象吗?

您可以覆盖BaseChannelFactory并修改它返回的ClientBase对象吗?

答案 2 :(得分:0)

Microsoft SVCUTIL.EXE可以通过正确实施INotifyPropertyChanged自动生成代理数据类。查看enableDataBinding参数。这不完全是你所要求的,但无论如何都可以解决你的需求。

答案 3 :(得分:0)

看看Castle WCF设施。我很确定你可以扩展它来添加INotifyPropertyChanged。 该工具使用DynamicProxy生成代理。

http://www.castleproject.org/container/facilities/trunk/wcf/index.html