2009-06-05 46 views
5

我正在开发一个WCF服务作为推荐here。它解决了我在开发原始.NET 2.0 Web服务时最初遇到的命名空间冲突问题,但我遇到了另一个问题。“System.ComponentModel.PropertyChangedEventHandler”不能从特殊类派生“System.MulticastDelegate”

我试图传递给wcf服务的对象用于客户端聚合来自用户的一堆信息,它的一些字段是绑定到UI控件(因此实现PropertyChangedEventHandler)。当我尝试在我的客户端项目中编译由svcutil生成的代理时,我得到了标题为这个问题的错误。

拉所有的数据从该对象,并投入到一个类用于发送(然后重构原始类型)将似乎是多余的 - 更不用说采取一个可笑的很长一段时间。

是否有解决方法?

+0

我'米困惑。你说你正在开发一个WCF服务,但是你说你正在开发一个.NET 2.0 Web服务。但是,WCF是.NET 3.0+。我的答案是基于.NET 3.0。 – 2009-06-05 18:57:18

+0

不,最初它是一个.NET 2.0 Web服务,但2.0 web服务中的名称空间冲突使设计变得复杂,所以我决定创建一个wcf服务(正如链接指向我的其他问题所述)。编辑澄清。 – 2009-06-05 19:24:11

回答

5

我可以检查?你是否将委托代理传递给Web服务?这将无法正常工作......它不能被序列化。充其量,ADO.NET数据服务(.NET 3.5SP1)可以做到通过翻译的Expression到查询字符串类似的东西...但是,这是接近你会得到。除此之外,你必须建立一个请求对象,用你的常规属性封装你的意图。

这适用于任何web的服务,WCF服务,TCP等的

* =委托基本上是一种类型安全方法手柄(带有可选的目标(例如)参考);它可以表示,例如,作为XML


(编辑)

从意见 - 这可能只是你没有归咎于你的数据的合同;这意味着它必须推断合同(并且它经常出错)。例如:

[DataContract] 
class Foo : IWhateverInterfaces { 
    [DataMember] 
    public string Bar {get;set;} 

    [DataMember] 
    public int Baz {get;set;} 

    public float NotPartOfTheContract {get;set;} 

    public event EventHandler AlsoNotPartOfTheContract; 
} 

当使用[DataContract],只有会员标志着[DataMember]序列化 - 这样的事件应该被忽略。这曾经是只有做WCF数据合同的方式,但MS调整它来推断领域的合同...一个错误国际海事组织,因为它导致你刚才的问题...