【问题标题】:WCF return "object" using KnownType attributeWCF 使用 KnownType 属性返回“对象”
【发布时间】: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


【解决方案1】:

来自https://msdn.microsoft.com/en-us/library/ms730167(v=vs.110).aspx

您当然可以返回 Object 并使用 KnownType 来定义其具体类型,但前提是 Object 是要返回的具体类型的属性。您必须有一个包含该对象的包装器类型。

KnownType 不适用于合约调用返回的对象,但适用于合约调用返回的类型中的不可知类型。将您的对象返回值包装成一个具体类型,称为......很可能是带有对象属性的“GetObjectDataWrapper”。用 KnownType 装饰 GetObjectDataWrapper。

【讨论】:

  • Brilliant:非常感谢 - 包装类甚至更适合真实环境。
  • 对于遇到相同问题的任何其他人 - 请注意 KnownType 属性所在的位置。我几乎到了那里,有一次我有一个包装类,但 KnownType 属性在内部类而不是包装类上,这当然意味着它不起作用。
  • 希望看到一个基于问题中给定代码的示例。
猜你喜欢
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 2022-01-23
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多