【发布时间】:2011-06-21 19:15:23
【问题描述】:
我已经设法让 WCF 回调(通过 NamedPipes)与字符串一起使用,但遗憾的是我无法让它与自定义类一起使用。
这是服务声明 + 实现: http://pastebin.com/Zayi2kjT
这是我的数据合同: http://pastebin.com/wFCxrRcJ
这是我在客户端所做的: http://pastebin.com/jxEbyEtP
当我改变时
public void Send()
{
try
{
channel.OnCallback("I love deadlines. I like the whooshing sound they make as they fly by.");
}
catch (Exception ex)
{
Form1.AddText(ex.GetType() + "|" + ex.Message);
}
}
到
channel.OnCallback(new TransmissionClass("I love deadlines. I like the whooshing sound they make as they fly by."));
调用回调方法时,服务器出现以下异常(见上文):
System.ServiceModel.FaultException
Der Formatierer hat beim Deserialisieren der Nachricht eine Ausnahme ausgelöst:
Fehler beim Deserialisieren von Parameter http://tempuri.org/:aUpdatedObject.
Die InnerException-Nachricht war "Das Element "http://tempuri.org/:aUpdatedObject"
enthält Daten eines Typs, der dem Namen "http://schemas.datacontract.org/2004/07
/ServerApp:TransmissionClass" zugeordnet ist.
Dem Deserialisierungsprogramm ist kein Typ bekannt, der diesem Namen zugeordnet ist.
Verwenden Sie ggf. einen DataContractResolver, oder fügen Sie den entsprechenden Typ für "TransmissionClass" der Liste der bekannten Typen hinzu.
Verwenden Sie dazu z. B. das Attribut "KnownTypeAttribute", oder fügen Sie den Typ der an DataContractSerializer übergebenen Liste von bekannten Typen hinzu.".
Weitere Details finden Sie unter "InnerException".
但是,我已将 KnownTypeAttribute 应用于 WCF 服务实现。
【问题讨论】:
-
您是在客户端还是服务器上得到异常?生成的客户端代码里面有
KnownTypeAttribute吗? -
服务器抛出异常。我已将 KnownTypeAttribute 添加到
ClientClass -
事实证明,在protracted but fruitful Q&A on chat :) 之后,基本问题是在回调合约中使用
object作为参数类型。客户端不知道如何反序列化自定义类型,所以KnownTypeAttribute必须在某个地方出现。 @yas4891,你最后是怎么解决的?您现在有DataContract- 和KnownType- 标记的参数类型吗?不妨写出你的解决方案作为答案。 -
我将
object更改为TransmissionClass并将KnownType应用于实现ClientInterface 的类。请写一个答案,你会得到这个学分