WCF回调不会传递派生类

时间:2011-07-25 06:17:53

标签: c# .net wcf wcf-callbacks

客户端

我的客户获得了以下回调合同:

[ServiceContract]
interface IEvent
{
    [OperationContract(IsOneWay = true)]
    void OnEvent(string serverName, string changeType, List<myObject> myObjects);

}

并获得了一个实现 IEvent 的课程如下:

class myClass : IEvent{
 public void OnEvent(string serverName, string changeType, List<myObject> myObjects)
    {
        MessageBox.Show(@"Event Called: " + changeType + @" occured at: " + serverName     + @" got " + myObjects.Count + " myObjects!");
    }
}

服务器端

我的服务器获得了以下发布代码:

methodInfo.Invoke(client, new object[] {serverName, changeType, myObjects});

问题

当我使用methodInfo.Invoke和myObjects = new List<myobject>(){}时 一切正常,意味着当服务器使用methodinfo.invoke时调用myClass.OnEvent 和mbox显示

BUT

当我尝试发送myObjects = new List<myobject>(){new MyDerivedObject()}时,它不起作用意味着当服务器使用methodinfo.invoke时,myClass.OnEvent被 NOT 调用 并且mbox 显示

服务器和客户端都包含对myObject和MyDerivedObject的myObject DLL的引用 MyDerivedObject当然是从myObject

派生的

请帮助

2 个答案:

答案 0 :(得分:3)

@eugene给出的示例也可以应用于服务合同,因此在您的情况下,您可以将ServiceKnownType应用于回调合同。

[ServiceContract]
[ServiceKnownType(typeof(MyDerivedObject))]
interface IEvent
{
    [OperationContract(IsOneWay = true)]
    void OnEvent(string serverName, string changeType, List<myObject> myObjects);
}

答案 1 :(得分:0)

要使WCF能够使用派生类,应为每个派生类使用KnownType属性修饰基类。不幸的是,这意味着基类应该知道它的派生类。在你的情况下,它将像:

[KnownType(typeof(MyDerivedObject))]
[DataContract]
class myobject
{
     // ...
}