0

客户端

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

[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 并显示 mbox 时调用 myClass.OnEvent

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

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

请帮忙

4

2 回答 2

3

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

[ServiceContract]
[ServiceKnownType(typeof(MyDerivedObject))]
interface IEvent
{
    [OperationContract(IsOneWay = true)]
    void OnEvent(string serverName, string changeType, List<myObject> myObjects);
}
于 2011-07-25T07:02:56.977 回答
0

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

[KnownType(typeof(MyDerivedObject))]
[DataContract]
class myobject
{
     // ...
}
于 2011-07-25T06:43:48.723 回答