我知道我们可以从android应用程序中使用WCF服务,并通过传递Requested URL中的值将值传递给WCF服务方法。但我调用的服务方法采用Object作为参数,我没有得到如何将此对象传递给服务方法?我使用的服务也是第三方,我不能对其进行任何修改。
或者有没有办法在Android应用程序中添加服务引用?
任何帮助?
由于
答案 0 :(得分:0)
服务 - 在WCF和所有其他技术堆栈上 - 通过发送消息而非对象进行通信。这是互操作性的基础,因此对我们来说非常重要。 WCF将CLR语言结构(如C#中的语言结构)转换为消息世界,然后再返回。所以我们有一种错觉,认为我们使用.NET对象进行编程,但实际上WCF正在代表我们进行基于消息的通信。
对于SOAP服务,消息以XML表示,消息模式(消息的合同)以XSD表示。当您编写使用System.Object作为参数的服务协定时,如下所示:
[ServiceContract]
public interface IService1
{
[OperationContract]
string GetData( object something );
}
然后GetData请求消息的消息模式如下所示:
<xs:element name="GetData">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="something" nillable="true" type="xs:anyType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
这里的关键是“something”元素的类型是“xs:anyType”。换句话说,这里允许绝对任何XML 。这是基于XML的消息传递领域最松散的合同。事实上,如此宽松,这项服务的大多数客户都不知道如何处理消息的内容,因为它可能是任何东西。这就是你在CLR世界中所说的,System.Object是所有引用类型的基类,所以它可以是任何东西。
在Android(或任何其他技术堆栈)世界中,试图使用这项服务,它可能会举手示意,“服务合同说这可能是什么,但我没有可接受的'这可能是任何类型,所以这不会起作用。“ (你没有描述你在Andriod方面遇到的问题的性质。这将是有启发性的。)
如果这个“如此松散而无意义”合同是由第三方撰写的,那么让我提出三个选择。
首先,获取不同的第三方服务或进行此更改。问题是他们已经编写了一个糟糕的合同服务,并且使用该合同作为互操作的基础(例如,WCF和Android)将成为问题或彻底失败。这个主题是服务合同101,它不是非常奇特。
其次,如果第三方服务支持JSON(除XML之外)消息,则可以简化松散合同的使用。
第三,创建一个包含第三方服务使用的服务。这个新服务将传递更有意义的类型(字符串,整数,具有[DataContract]属性的类)并封装有意义类型和System.Object之间的转换。然后,Android客户端可以使用具有有意义合同的新服务。
希望有所帮助!
答案 1 :(得分:0)
请查看ksoap for android。如果您尝试使用库和相关的示例集,那么调用WCF服务非常容易。你可以添加方法参数,请求标题等几乎任何你想要的东西。