Apache flex 在运行时设置WebServiceWrapper endpointURI 我正处于从Flex Builder 3切换到Flash Builder 4的过程中,我遇到的一个问题是,对4的Web服务的支持有很大的不同。在这两个IDE中,我都能够为我的web服务导入WSDL,它将生成用于与服务通信的适当客户机类。每种语言中生成的代码都是不同的

Apache flex 在运行时设置WebServiceWrapper endpointURI 我正处于从Flex Builder 3切换到Flash Builder 4的过程中,我遇到的一个问题是,对4的Web服务的支持有很大的不同。在这两个IDE中,我都能够为我的web服务导入WSDL,它将生成用于与服务通信的适当客户机类。每种语言中生成的代码都是不同的,apache-flex,flash,flex4,flash-builder,Apache Flex,Flash,Flex4,Flash Builder,在我的Flex3代码中,我能够访问mx.rpc.soap.AbstractWebService的endpointURI属性,但在生成的Flex4代码中,新类扩展了com.adobe.fiber.services.wrapper.WebServiceWrapper,它没有endpointURI属性 我的项目有多个游戏服务器,玩家选择他们想在哪个服务器上玩。在过去,如果玩家想要服务器1,我会将端点URI设置为,而像wise一样,如果他们想要服务器2,我会将端点设置为 在Flash Builder 4

在我的Flex3代码中,我能够访问mx.rpc.soap.AbstractWebService的endpointURI属性,但在生成的Flex4代码中,新类扩展了com.adobe.fiber.services.wrapper.WebServiceWrapper,它没有endpointURI属性

我的项目有多个游戏服务器,玩家选择他们想在哪个服务器上玩。在过去,如果玩家想要服务器1,我会将端点URI设置为,而像wise一样,如果他们想要服务器2,我会将端点设置为


在Flash Builder 4中,我希望通过什么来实现这一点?

您应该能够覆盖Web服务上的endpointURI。但是我不确定在哪里使用生成的代码,因为我使用了

简短的回答:

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

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服务时,FlashBuilder将自动为我创建两个类

internal class _Super_GameService extends 
com.adobe.fiber.services.wrapper.WebServiceWrapper
{ ... }

public class GameService extends _Super_GameService
{}
_Super_GameService包含所有自动生成的调用web服务的代码。GameService本身不包含代码,但与超级GameService不同,它是公共的。这里的想法是,我们需要对GameService进行的任何增强都可以对GameService进行,然后,如果我们需要更新,_Super_GameService可以重新生成,但对GameService的更改不会被代码生成工具覆盖

现在,这将引导我们使用这些生成的类。通常,我需要做的就是创建GameService的一个实例并对其调用一个方法。在本例中,DoSomethingAwesome是web服务上可用的方法

var gs:GameService = new GameService();
var token:AsyncToken = gs.DoSomethingAwesome();
现在,这将使用WSDL文件中指定的服务的URI调用该服务。在我的情况下,我希望GameService连接到不同的URI。这本应该很简单,但事情却分崩离析了

我的第一个问题是在WebServiceWrapper()上查看文档没有在Firefox中正确呈现。因此,当我阅读文档时,我没有得到完整的信息。这确实需要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的源代码,()似乎没有一个排除标记来解释为什么endpointURI没有出现在Intellisense上下文菜单中。所以我不知道那里发生了什么。

这是我唯一能让它工作的方法,在为您的服务生成的存根中:

import com.adobe.fiber.core.model_internal;
此外:


我已经发现我需要做的事情与操纵通道集有关,但我还不知道我在做什么。好吧,所以编辑通道集会破坏一切。我还在这里迷路。为什么他妈的Adobe要用一种简单的方式工作,却把它弄得如此复杂以至于无法使用?为什么我所有的flash web服务搜索结果都是在设计时绑定的?如果我不想将web服务结果绑定到GUI,该怎么办?如果在firefox中正确呈现文档()会有所帮助。我真的不能接受这个答案,因为它没有回答这个问题。我知道我可以在mxml中设置通道,但这并不能解决如何在运行时设置端点的问题。我不确定你的意思。您当然可以在Flex中有一个事件处理程序,用于在运行时设置WebService对象的endpointURI属性。您需要一个代码示例来说明如何做到这一点吗?getWebService()公开的WebService对象确实有一个endpointURI属性,我可以在使用Flex Builder 3生成的代码时设置该属性,该代码是使用mx.rpc.soap.AbstractWebService生成的。Flash Builder 4生成的代码扩展了com.adobe.fiber.services.wrapper.WebServiceWrapper,它是一个完全不同的对象,没有endpointURI。在问题的第二段,我使用运行时WebService库而不是代码生成库的原因之一是因为这种事情更容易处理。但是我很高兴你知道了如何使用生成的代码来实现这一点。James,你的思路是正确的,可以在WebServiceWrapper类的serviceControl属性中设置endpointURI属性,正是由于这种情况,我们很难找到答案。我不敢相信,在2010年9月20日至2012年11月20日之间,这个答案竟然以惊人的零票率被搁置了下来。这是一个早该出现的+1。