我正在从Flex Builder 3切换到Flash Builder 4,我遇到的一个问题是对4中的Web服务的支持大不相同。在这两个IDE中,我能够为我的Web服务导入WSDL,它将生成适当的客户端类以与服务进行通信。每个生成的代码都不同。
在我的Flex3代码中,我能够访问mx.rpc.soap.AbstractWebService的endpointURI属性,但是在生成的Flex4代码中,新类扩展了com.adobe.fiber.services.wrapper.WebServiceWrapper。没有endpointURI属性。
我的项目有多个游戏服务器,玩家选择他们想要玩的服务器。在过去,如果玩家想要服务器1,我会将端点URI设置为http://game1.server.com/service.asmx,如果他们想要服务器2,我会将端点设置为http://game2.server.com/service.asmx。
我想在Flash Builder 4中实现此目的是什么?
答案 0 :(得分:4)
简答:
var s:ClassThatExtendsWebServiceWrapper = new ClassThatExtendsWebServiceWrapper;
s.serviceControl.endpointURI = 'http://service.com/service.asmx';
长答案:
好吧,我终于找到了解决方案。 Adobe似乎已经比以前更加努力了。
Flash Builder 4生成的Web Service类扩展了com.adobe.fiber.services.wrapper.WebServiceWrapper。 WebServiceWrapper有一个名为serviceControl的属性,可用于控制服务。问题是并非所有serviceControl成员都可以在应用程序代码级别访问。让我们假设我有一个名为GameService的Web服务。当我使用数据工具通过提供WSDL连接到Web服务时,Flash Builder将自动为我创建两个类。
internal class _Super_GameService extends
com.adobe.fiber.services.wrapper.WebServiceWrapper
{ ... }
public class GameService extends _Super_GameService
{}
_Super_GameService包含所有自动生成的代码,用于调用Web服务。 GameService本身不包含代码,但与_Super_GameService不同,它是公共的。这里的想法是我们需要对GameService进行任何增强,然后如果我们需要更新,可以重新生成_Super_GameService,但是代码生成工具不会覆盖对GameService的更改。
现在这导致我们使用这些生成的类。通常,我应该做的就是创建一个GameService实例并在其上调用一个方法。在此示例中,DoSomethingAwesome是Web服务上可用的方法。
var gs:GameService = new GameService();
var token:AsyncToken = gs.DoSomethingAwesome();
现在,这将使用WSDL文件中指定的服务的URI调用服务。在我的情况下,我希望GameService连接到不同的URI。这应该很简单,但事情就崩溃了。
我的第一个问题是在Firefox上查看WebServiceWrapper(http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/com/adobe/fiber/services/wrapper/WebServiceWrapper.html)上的文档无法正确呈现。因此,当我阅读文档时,我没有全面了解。这确实需要由Adobe修复。
在另一个浏览器中查看文档帮助我了解WebServiceWrapper的serviceControl属性。 serviceControl声明为mx.rpc.soap.AbstractWebService。 AbstractWebService有一个endpointURI属性,它使以下代码有效。
var gs:GameService = new GameService();
gs.serviceControl.endpointURI = 'http://game1.service.com/GameService.asmx';
我遇到的另一个问题是,由于某种原因,serviceControl的endpointURI属性没有出现在Intellisense上下文菜单中。因为我最初没有在在线文档中看到serviceControl,并且我没有在intellisense中看到endpointURI,所以我没有意识到该属性是否存在。
如果查看AbstractWebserivce的源代码(http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/frameworks/projects/rpc/src/mx/rpc/soap/AbstractWebService.as),似乎没有一个Exclude标记来解释为什么endpointURI没有出现在Intellisense上下文菜单中。所以我不知道那里发生了什么。
答案 1 :(得分:0)
您应该能够覆盖WebService上的endpointURI。但是我不确定使用生成的代码在哪里这样做,因为我使用<s:WebService/>
。
答案 2 :(得分:0)
这是我可以在生成的服务存根中使用它的唯一方法:
import com.adobe.fiber.core.model_internal;
此外:
/**
* Override super.init() to provide any initialization customization if needed.
*/
protected override function preInitializeService():void
{
_needWSDLLoad = false; // to prevent loading the default WSDL
super.preInitializeService();
// Initialization customization goes here
wsdl = "http://localhost/yourservice?wsdl";
_needWSDLLoad = true;
model_internal::loadWSDLIfNecessary();