返回具有对象类型的自定义结果
本文关键字:自定义 结果 类型 对象 返回 | 更新日期: 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)使用