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

本文关键字:自定义 结果 类型 对象 返回 | 更新日期: 2023-09-27 18:14:09

我正在尝试从我的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服务:返回自定义对象,但作为解决方案,他们改变类型

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

通常不可能在WCF服务中使用基本公共对象。

下面是WSDL类型声明的示例:
   <complexType name="TimePeriod">
      <all>
          <element name="StartTime" type="xsd:timeInstant"/>
          <element name="EndTime" type="xsd:timeInstant"/>
      </all>
   </complexType>

这个模式对客户端是可见的,然后。net可以理解它可以使用自己的对象并传输它。在。net中,这类似于

[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)第二个解决方案将使用二进制流并在消息头中写入类型名称,方法类似于第一点。

这取决于具体情况,但我建议对于大文件(> 1mb)使用