我正在尝试编写一个符合规范的 Web 服务,它需要不同的响应主体,具体取决于方法是否成功完成。我尝试创建两个不同的 DataContract 类,但是如何返回它们并正确序列化它们?
3 回答
指示您的 WCF Web 服务失败的最佳方法是引发 FaultException。您的服务 web.config 文件中有一些设置允许将整个故障消息作为错误的一部分传递给客户端。
另一种方法可能是从同一个基类或接口继承两个结果。该服务将返回基本类型的实例。然后,您可以使用 KnownType 属性通知客户端可能会返回多种类型。想一想,也许可以使用 Object 作为基本类型,但我还没有尝试过。
如果这些方法中的任何一种都失败,您可以创建一个包含结果和错误属性的自定义结果对象,然后您的客户可以决定采取哪种行动。我不得不对 Silverlight 2 使用这种方法,因为 Beta 2 还没有完全支持故障契约。它不漂亮,我通常不会推荐它,但如果它是唯一有效的方法,或者你认为它是适合你情况的最佳方法......
如果您在使用 ADO.NET 数据服务时遇到问题,我在这方面的经验较少。
以下是有关实施 FaultContracts的一些信息
答案是肯定的,但它很棘手,而且你在界面上失去了强输入。如果您返回Stream,则数据可以是 xml、文本,甚至是二进制图像。对于 DataContract 类,您将使用DataContractSerializer序列化数据。
有关更多详细信息,请参阅BlogSvc,更具体地说是RestAtomPubService.cs WCF 服务。请注意,该源代码还将向您展示如何将不同类型的数据接受到需要内容类型映射器的 WCF 休息方法中。
如果您使用的是基于 xml 的绑定,那么我相信没有办法做到这一点。在这种情况下,一个简单的解决方案是在出现故障时只保留部分消息标志,并在需要时将故障信息存储在某处。对于 JSON 绑定,您可以使用返回对象的方法,然后返回两种不同类型的对象。如果我没记错(这很少见),那是可能的,因为如果对象没有序列化属性,JavaScriptSerializer 类会使用反射。