【发布时间】:2009-08-24 09:12:51
【问题描述】:
我对 WCF 还很陌生,只是对如何正确获取 MessageContract 继承有疑问。我的设置的简化版本如下 - 一个“基本”消息类型,然后是另一个继承自它的“测试”消息。
[MessageContract]
public abstract class BaseMessage
{ }
[MessageContract]
public class TestMessage : BaseMessage
{ }
然后我在 ServiceContract 上有一个异步 OperationContract,定义为:
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginFindRequest(BaseMessage request, AsyncCallback callback, object asyncState);
我遇到的问题是,当调用 BeginFindRequest 方法并为请求参数传入 TestMessage 实例时,WCF 框架将 TestMessage 实例反序列化为服务/服务器端的 BaseMessage。由于这被定义为一个抽象类,它会导致以下错误:
"消息无法反序列化 进入 MessageContract 类型 BaseMessage 因为它没有默认值 (无参数)构造函数。”
从我能找到的关于 MessageContract 继承的有限信息来看,它似乎应该可以工作。
所以我的问题是 - 为了让它发挥作用,我缺少什么;或者我是否应该在 ServiceContract 上专门为该类型定义一个单独的 OperationContract - 缺点是我最终可能会得到许多额外的 OperationContract?
【问题讨论】:
-
PS - 我正在使用 net.tcp 和 NetDataContractSerializer(在客户端/服务器上)。
-
嘿弗兰克 - 使用它上面的“代码按钮”(带有 010101010110 的那个) - 格式化您的代码部分。它可以很好地缩进它们,并且语法会突出显示它们 - 强烈推荐!
-
谢谢 Marc,想知道你是怎么做到的!
-
@Frank: 黑魔法和巫术:-)
标签: wcf inheritance messagecontract operationcontract