我有一个.NET WCF服务(不是Web服务),有很多方法,有些接受并返回复杂的数据类型。我在Windows Phone 7应用程序中使用这些服务。这一切都很好,很容易。
现在我正在评估将我的一些应用程序移植到Android的可行性,但我无法弄清楚如何从Android客户端调用我的WCF服务。
我在 Invoke webservices from Android 中找到了一个工作示例。
但这似乎是访问“Web服务”,而不是WCF服务。
我的服务位于http://www.deanblakely.com/Service2.svc
,它包含一个名为“SimpleTest”的简单方法,只返回字符串“Alive”。
使用链接文章中的代码,我将http://www.deanblakely.com/Service2.svc
放在了OPERATION_NAME的SOAP_ADDRESS和SimpleTest中。但我不知道在SOAP_ACTION和WSDL_TARGET_NAMESPACE中放入什么。我甚至不知道这种方法是否有效。
在.NET中,Visual Studio为我们构建了一个“服务引用”,一切正常。
我也不明白以下两行代码......
httpTransport.call(SOAP_ACTION, envelope);
Object response = envelope.getResponse();
使用WCF服务时,调用是异步的,因此我们调用SimpleTestAsync并为异步返回留下回调。这两行代码似乎是同步的,没有?
答案 0 :(得分:4)
当从非Windows客户端与WCF服务进行通信时,您基本上将其视为XML Web服务。如果您将WCF服务配置为使用basicHttp绑定,那么就Java而言,它将像任何其他Web服务一样运行。
通常,要从Java调用WCF服务,可以使用wsimport
创建一组自定义代理和数据类,类似于服务引用的工作方式。 Android没有这些类所需的所有库,但我确实找到了这个URL:
http://code.google.com/p/androidclientgenerator-wsimport/
这是专门针对Android的代理类生成器。您可能希望下载此代理生成器,而不是使用该网页上的代码;您只需将URL传递给服务的WSDL页面,它就会为所有内容创建类型化的Java类。如果您来回传递复杂类型,这可能是一个更好的选择。
但是,如果您想继续使用示例代码,则需要填写已识别的变量。变量只是SOAP信封的典型参数。这些是在服务的WSDL中定义的,主要基于您为服务定义的命名空间。 (它们在很大程度上独立于您的服务所在的实际URL,但有一个例外)。您可以在WCF服务合同中指定命名空间:
[ServiceContract(Namespace = "http://namespaces.deanblakely.com/wcf")]
请注意,名称空间网址 指向真实资源,尽管它们经常这样做。它甚至不需要是一个URL(我经常使用骨灰盒);它只需要是一个独特的字符串。现在假设您已将上述命名空间分配给您的服务。
WSDL_TARGET_NAMESPACE就是命名空间,与上面完全相同。 OPERATION_NAME是您要调用的方法的名称,例如SimpleTest
。 SOAP_ACTION是命名空间和操作的组合;在你的情况下,http://namespaces.deanblakely.com/wcf/SimpleTest
。在您的WSDL中,您将在操作标记中看到这一点:
<wsdl:operation name="SimpleTest">
<soap:operation soapAction="http://namespaces.deanblakely.com/wcf/SimpleTest" style="document"/>
SOAP_ADDRESS是唯一实际指向您的服务文件的文件,例如http://www.deanblakely.com/Service2.svc
。
希望这会让您开始调用您的网络服务;如果没有随意停下来获得更多帮助。
编辑:错过了关于异步调用的部分。
是的,该网页上描述的方法是同步的。默认情况下,WCF服务方法是同步的,并且在Visual Studio中生成服务引用时包含异步调用选项。 wsimport
生成异步就绪代理,因此使用Android客户端生成也可以帮助您解决此问题。