【问题标题】:WCF Return a custom result with an object typeWCF 返回具有对象类型的自定义结果
【发布时间】:2015-10-12 11:33:56
【问题描述】:

我正在尝试从我的 WCF 函数调用中返回一个 object,如果我在我的 ServiceModel 中指定类型,则结果发送成功。

但是如果我发送一个对象显示我这样的消息:

wcf 测试客户端不支持此操作,因为它使用类型

代码:

[DataContract]
public class ServiceModel
{
    [DataMember]
    public int status { get; set; }

    [DataMember]
    public string message { get; set; }

    [DataMember]
    public requestdVM result { get; set; }
    //public object result { get; set; }
}

问题类似于:WCF service: Returning custom objects 但作为解决方案,它们会更改类型

【问题讨论】:

  • 能否提供requestdVM 代码?
  • 我正在阅读 [这篇文章][1] 并说:您不能返回“对象”,因为它不能使用 WCF 序列化。如果要重新调整对象,则它们必须是自定义序列化对象,并使用 [Serializable] 属性进行修饰。 [1]:pcreview.co.uk/forums/…@HenkaProgrammer
  • 这可能会有所帮助 - stackoverflow.com/questions/5204893/…
  • 问题是:这是否只发生在(有些受限的)WCF 测试客户端上?您是否尝试过自己制作一个小客户端应用程序来调用此 WCF 方法?
  • @marc_s 是的,这是一个简单的应用程序来测试它,也许问题是xml 的生成结果,如果我将复杂类型转换为其他内容类型,xml 可能很复杂并且可能因为对象中的连续性可能有交叉引用

标签: c# wcf


【解决方案1】:

一般情况下,在 WCF 服务中使用基本通用对象是不可能的。

这里是 WSDL 类型声明的例子:

   <complexType name="TimePeriod">
      <all>
          <element name="StartTime" type="xsd:timeInstant"/>
          <element name="EndTime" type="xsd:timeInstant"/>
      </all>
   </complexType>

此架构对客户端可见,然后 .NET 可以理解它可以使用自己的对象并传输它。 在 .NET 中,这将是 similar to

[DataContract]
public class TimePeriod
{
   [DataMember]
   public DateTime StartTime {get;set;}
   [DataMember]
   public DateTime EndTime {get;set;}
}

Java 可以理解 WSDL 并使用自己的类和对象; Python可以,PHP可以,希望你有SOA的想法。

现在你想发送可以是任何东西的对象。合同是不可能的。

但是,如果您可以保证在您的项目中只使用 .NET,那么就有一个解决方案。
这个想法是以二进制格式序列化 .NET 对象并给出对象的类型名称。然后在客户端反序列化它。当然,您不能简单地将对象从 .NET 发送到 Python。

1) 以字符串 XML 格式发送的小对象

[Serializable]
public class Data
{
  public string TypeName {get;set;} // typeof(string), typeof(int), etc.
  public string Xml {get;set;} // serialized object via XmlSerializer
}

然后在客户端序列化和接收对象后就可以反序列化了

    Data objectData;// we got it from service
    var serializer = new XmlSerializer(typeof(objectData.TypeName));
    object result;

    using (TextReader reader = new StringReader(objectData.Xml))
    {
        result = serializer.Deserialize(reader);
    }

也可以用二进制序列化代替XML,那么就会有byte[]属性。

2) 第二种方案是使用二进制流并在header of message 中写入类型名称,方法与第一种方法类似。

一切视情况而定,但我推荐它用于大文件 (> 1 MB)。

【讨论】:

  • 问题是我需要发送不同的结果作为我的服务的结果。然后,我正在尝试构建一个通用服务来发送不同类型的结果(字符串、Int32、自定义类型等)@Artru
  • @MrMins,如果令人困惑,请写下盲点,我会澄清它们
猜你喜欢
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 2018-03-16
相关资源
最近更新 更多