gpt4 book ai didi

c# - WCF:在回调中使用自定义类

转载 作者:行者123 更新时间:2023-11-30 16:29:17 26 4
gpt4 key购买 nike

我已经设法让 WCF 回调(通过 NamedPipes)处理字符串,但遗憾的是我无法让它处理自定义类。

这是服务声明+实现: http://pastebin.com/Zayi2kjT

这是我的数据契约(Contract): 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 服务实现。

最佳答案

一般来说,无论谁(服务器或客户端)正在反序列化参数或返回值,都需要知道在运行时期望什么类型(而不是什么契约)才能这样做。在这种情况下,object 类型的已声明参数不会为客户端提供足够的信息来反序列化服务器可能发回给它的任何内容。将其替换为类型 supported by the DataContractSerializer (并用[KnownType]装饰,如果服务器计划在回调中发送子类实例)解决了这个问题。

您还可以使用 configuration告诉 DataContractSerializer 已知类型,但这是应用程序范围的,对我来说似乎有点生硬。

我曾经遇到过一个不起眼的案例,我的契约(Contract)看起来是这样的:

[ServiceContract]
interface ISearch
{
[OperationContract]
SearchResult Search(SearchQuery query);
}

[DataContract]
[KnownType(typeof(Subclass1InSharedAssembly)), etc...]
class SearchResult
{
[DataMember]
BaseClassDeclaredInSharedAssembly Value { get; set; }
}

因为我希望服务器和客户端使用(有用的)共享程序集类型,所以我在两者中都引用了共享程序集,并选择不为它们生成任何代理类型...所以 svcutil 没有为我生成任何 KnownTypeAttribute。部分类(class)救了我的培根;在客户端,您可以这样做:

// generated proxy .cs
[DataContract]
partial class SearchResult
{
...
}

// hand-written .cs
[KnownType(typeof(Subclass1InSharedAssembly)), etc.]
partial class SearchResult
{
// Now the client knows how to deserialise derived types.
}

关于c# - WCF:在回调中使用自定义类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6430751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com