2012-03-19 75 views
1

我有许多方法的.NET WCF服务(不是Web服务),有些接受和返回复杂的数据类型。我使用Windows Phone 7应用程序中的这些服务。这一切都很好,很容易。从Android访问.NET WCF服务

现在我正在评估将一些应用程序移植到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,离开异步回回调。这两行代码似乎是同步的,不是?

回答

4

从非Windows客户端与WCF服务进行通信时,基本上将其视为XML Web服务。就Java而言,如果将WCF服务配置为使用basicHttp绑定,它将像任何其他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并不需要指向一个真正的资源,但他们经常做。它甚至不需要是一个URL(我经常使用urns);它只需要是一个独特的字符串。现在让我们假设你将上面的命名空间分配给你的服务。

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客户端生成也可能会帮助你在这方面。