首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF MessageContract继承

WCF MessageContract继承
EN

Stack Overflow用户
提问于 2009-08-24 09:12:51
回答 6查看 4.4K关注 0票数 5

我对WCF相当陌生,只是想知道如何正确地使MessageContract继承工作。我的设置的简化版本如下--一个“基本”消息类型,然后是另一个继承自它的“测试”消息。

代码语言:javascript
复制
[MessageContract]
public abstract class BaseMessage
{ }

[MessageContract]
public class TestMessage : BaseMessage
{ }

然后,我在一个OperationContract上定义了一个异步ServiceContract,定义为:

代码语言:javascript
复制
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginFindRequest(BaseMessage request, AsyncCallback callback, object asyncState);

我遇到的问题是,当调用BeginFindRequest方法时,并为请求参数传入一个TestMessage实例时,WCF框架正在将TestMessage实例反序列化为服务/服务器端的BaseMessage。由于它被定义为一个抽象类,因此会导致以下错误:

“该消息不能反序列化为MessageContract类型的BaseMessage,因为它没有默认(无参数)构造函数。”

从我所能找到的关于MessageContract继承的有限信息来看,它似乎只是起作用了。

因此,我的问题是--为了让这件事正常工作,我缺少了什么;或者我应该在ServiceContract上为这种类型专门定义一个单独的OperationContracts--缺点是我最终可能会有许多额外的OperationContracts?

EN

回答 6

Stack Overflow用户

发布于 2009-08-24 14:42:11

最后我发现这篇博文击中了我的脑袋-

不幸的是,在WCF中表达合同的方式很容易忘记它们的目的:定义发送到操作的消息并从操作中发送回来。实际上,您必须考虑“如何用XML表示这些数据?”XML不支持继承,所以无论您在契约中放入什么,都必须有一些映射到XML的方法。用于定义消息的数据契约只是为您想要传递的数据生成XML的一种.NET类型化的便利--如果您以其他方式查看它们,那么您注定要面对一个痛苦的世界。因此,考虑您想要传递的数据,而不是如何在您的业务层中表示这些数据,并相应地设计您的DataContracts。

http://www.dotnetconsult.co.uk/weblog2/PermaLink,guid,a3775eb1-b441-43ad-b9f1-e4aaba404235.aspx

因此,我将进行重构,以提供具有显式契约类型的额外方法。这还允许我通过删除所有类型检查来清理服务实现。

谢谢你的帮助。

票数 6
EN

Stack Overflow用户

发布于 2009-08-24 09:45:41

好的,第一个问题是:为什么你真的要使用消息契约?你真的有这个需要吗?

通常,只有当您需要严格控制SOAP消息的布局时,才会使用消息契约,例如,为了满足需要调用的遗留系统,需要特定的标头等等。

“正常”的WCF调用几乎不需要使用消息契约。

您可以使用[ServiceContract]定义服务调用(服务上的方法),以及作为[DataContract]传递的数据结构。如果您有一个DataContract,那么在如何处理服务中的继承/多态(比消息契约构造更多)方面有更多的选项。

Marc

票数 3
EN

Stack Overflow用户

发布于 2009-08-24 09:26:55

是否可以更改BaseMessage,使其成为具有无参数构造函数的具体类?

错误消息告诉我们无法初始化BaseMessage类型的对象,因为它是抽象的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1321278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档