我正在从 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 中完成此任务,我需要什么?

最佳答案

简答:

var s:ClassThatExtendsWebServiceWrapper = new ClassThatExtendsWebServiceWrapper;
s.serviceControl.endpointURI = 'http://service.com/service.asmx';

长答案:

好吧,我终于找到了解决方案。 Adobe 似乎使这件事变得比应有的困难得多。

Flash Builder 4 生成的 Web 服务类扩展了 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。这应该很简单,但事情却崩溃了。

我的第一个问题是查看 WebServiceWrapper ( http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/com/adobe/fiber/services/wrapper/WebServiceWrapper.html ) 上的文档没有在 Firefox 中正确呈现。所以当我阅读文档时,我没有得到完整的画面。这确实需要由 Adob​​e 修复。

在另一个浏览器中查看文档帮助我了解了 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 上下文菜单中。所以我不知道那里发生了什么。

关于apache-flex - 在运行时设置 WebServiceWrapper endpointURI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3739038/

10-11 16:33