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