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 が呼び出されます。

しかし

サーバーがmethodinfo.invokeを使用し、mboxが表示されない場合、送信しようとするmyObjects = new List<myobject>(){new MyDerivedObject()}と機能しません。つまり、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 に答える