Обратный вызов WCF не пройдет производный класс - PullRequest
0 голосов
/ 25 июля 2011

СТОРОНА КЛИЕНТА

мой клиент получил следующий контракт обратного вызова:

[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>(){}, все работает нормально, т.е. myClass.OnEvent вызывается, когда сервер использует methodinfo.invoke и mbox отображается

НО

, когда я пытаюсь отправить myObjects = new List<myobject>(){new MyDerivedObject()}, это не работает, означая myClass.OnEvent NOT вызывается, когда сервер использует methodinfo.invoke, а mbox отображается NOT

и сервер, и клиент содержат ссылки на myObject DLL, в которой есть как myObject, так и MyDerivedObjectкурс, полученный из myObject

Помогите пожалуйста

Ответы [ 2 ]

3 голосов
/ 25 июля 2011

Пример, который дал @eugene, также может быть применен к контракту на обслуживание, поэтому в вашем случае вы можете применить ServiceKnownType к контракту обратного вызова.

[ServiceContract]
[ServiceKnownType(typeof(MyDerivedObject))]
interface IEvent
{
    [OperationContract(IsOneWay = true)]
    void OnEvent(string serverName, string changeType, List<myObject> myObjects);
}
0 голосов
/ 25 июля 2011

Чтобы WCF мог использовать производные классы, базовый класс должен быть украшен атрибутом KnownType для каждого из производных классов.К сожалению, это означает, что базовый класс должен знать о своих производных классах.В вашем случае это будет как:

[KnownType(typeof(MyDerivedObject))]
[DataContract]
class myobject
{
     // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...