WCF返回对象类型的自定义结果

时间:2014-07-22 22:59:55

标签: c# wcf

我尝试从我的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但作为解决方案,他们会更改类型

1 个答案:

答案 0 :(得分: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,比如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中使用二进制流和写入类型名称,方法类似于第一点。

一切都取决于具体情况,但我建议大文件(&gt; 1 MB)。