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