WCF MessageContract继承

Fra*_*ell 5 wcf inheritance operationcontract messagecontract

我对WCF很新,只是有一个关于如何正确获取MessageContract继承的问题.我的设置的简化版本如下 - "基本"消息类型,然后是从其继承的另一个"测试"消息.

[MessageContract]
public abstract class BaseMessage
{ }

[MessageContract]
public class TestMessage : BaseMessage
{ }
Run Code Online (Sandbox Code Playgroud)

然后我在ServiceContract上有一个异步的OperationContract定义为:

[OperationContract(AsyncPattern = true)]
IAsyncResult BeginFindRequest(BaseMessage request, AsyncCallback callback, object asyncState);
Run Code Online (Sandbox Code Playgroud)

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

"消息无法反序列化为MessageContract类型的BaseMessage,因为它没有默认的(无参数)构造函数."

从我可以在MessageContract继承上找到的有限信息,它似乎应该工作.

所以我的问题是 - 为了让这个工作,我错过了什么; 或者我应该在ServiceContract上专门针对该类型定义一个单独的OperationContract - 缺点是我最终可能会有许多额外的OperationContracts?

Fra*_*ell 6

最后我发现这个博客文章在头上发了钉 -

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

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

所以我将重构以提供具有显式契约类型的附加方法.这也将允许我通过删除所有类型检查来清理服务实现.

谢谢你的帮助.