【发布时间】:2016-04-20 11:26:31
【问题描述】:
我在从 WCF 服务返回对象时遇到问题。包括一个最小的例子
[ServiceContract]
public interface IService1
{
[OperationContract]
object GetObjectData();
}
当 GetObjectData() 方法返回一个字符串时,一切正常,我的客户端可以读取数据,但是当它返回一个不同的对象时,例如,一个公共程序集中的对象:
[DataContract]
[KnownType(typeof(TestObject))]
public class TestObject
{
[DataMember]
public string StringProperty { get; set; }
[DataMember]
public int IntProperty { get; set; }
}
然后客户端对 webservice 方法的调用崩溃。通过在互联网上阅读,KnownType 属性(如上)应该已经解决了我所有的问题,但是我现在从我的客户那里得到了以下错误。感谢您的帮助。
{“格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数http://tempuri.org/:GetObjectDataResult时出错。InnerException消息是'第1行位置289错误。元素'http://tempuri.org/:GetObjectDataResult'包含数据从映射到名称“http://schemas.datacontract.org/2004/07/ClassLibrary1Common:TestObject”的类型。反序列化器不知道映射到此名称的任何类型。如果您正在使用 DataContractSerializer,请考虑使用 DataContractResolver,或者将与“TestObject”对应的类型添加到已知类型 - 例如,通过使用 KnownTypeAttribute 属性或将其添加到传递给序列化程序的已知类型列表中。'。有关更多详细信息,请参阅 InnerException。"}
【问题讨论】:
-
你不是用 KnownType 装饰你的服务合同吗?而不是你的数据对象?
-
这不是我以前看到它使用的方式。在其他地方有工作代码,它从 DataContract 类上的 KnownType 的公共库返回一个对象,这就是我感到困惑的原因。
-
刚试过,我得到智能感知,说你不能将 KnownType 添加到接口。所以你不能在 ServiceContract 上定义它。
-
2 个问题。您是否必须使用 WCF(比方说 WebAPI)?是否可以将对象作为 JSON 字符串返回?
-
由于时间限制(webservice 和客户端的编码非常多),无法真正远离 WCF,并且仅在开始部署它们时才发现这个问题(我所有的单元测试都通过了,因为它们正在调用代码中的方法而不是 Web 服务本身)。我的后备选项是将类(在公共代码中)装饰为可序列化并将信息作为字符串返回......
标签: c# wcf object marshalling