Краткий ответ:
var s:ClassThatExtendsWebServiceWrapper = new ClassThatExtendsWebServiceWrapper;
s.serviceControl.endpointURI = 'http://service.com/service.asmx';
Длинный ответ:
Ну, я наконец-то нашел решение. Похоже, Adobe сделала это намного сложнее, чем следовало.
Классы веб-служб, создаваемые Flash Builder 4, расширяют com.adobe.fiber.services.wrapper.WebServiceWrapper. WebServiceWrapper имеет свойство serviceControl, которое можно использовать для управления службой. Проблема в том, что не все члены serviceControl доступны на уровне кода приложения. Предположим, у меня есть веб-сервис под названием GameService. Когда я использую инструмент данных для подключения к веб-службе с помощью WSDL, Flash Builder автоматически создаст для меня два класса.
internal class _Super_GameService extends
com.adobe.fiber.services.wrapper.WebServiceWrapper
{ ... }
public class GameService extends _Super_GameService
{}
_Super_GameService содержит весь автоматически сгенерированный код для вызова веб-службы. GameService не содержит сам код, но, в отличие от _Super_GameService, он общедоступен. Идея заключается в том, что любые улучшения, которые нам нужно внести, могут быть сделаны в GameService, а затем, если нам потребуется обновление, _Super_GameService может быть восстановлен, но изменения GameService не будут перезаписаны инструментом генерации кода.
Теперь это приводит нас к использованию этих сгенерированных классов. Обычно все, что мне нужно сделать, - это создать экземпляр GameService и вызвать для него метод. В этом примере DoSomethingAwesome - это метод, доступный в веб-сервисе.
var gs:GameService = new GameService();
var token:AsyncToken = gs.DoSomethingAwesome();
Теперь это вызовет службу, используя URI службы, указанной в файле WSDL. В моей ситуации я хотел, чтобы GameService подключался к другому URI. Это должно было быть простым, но вещи развалились.
Моя первая проблема заключалась в том, что просмотр документации в WebServiceWrapper (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/com/adobe/fiber/services/wrapper/WebServiceWrapper.html) не отображался должным образом в Firefox. Поэтому, когда я читал документацию, я не получал полную картину. Это действительно нужно исправить Adobe.
Просмотр документации в другом браузере помог мне узнать о свойстве serviceControl в WebServiceWrapper. serviceControl объявлен как mx.rpc.soap.AbstractWebService. AbstractWebService имеет свойство endpointURI, которое делает следующий код допустимым.
var gs:GameService = new GameService();
gs.serviceControl.endpointURI = 'http://game1.service.com/GameService.asmx';
Другая проблема, с которой я столкнулся, заключается в том, что по какой-то причине свойство endpointURI serviceControl не отображается в контекстном меню Intellisense. Поэтому, поскольку я сначала не увидел serviceControl в онлайн-документации и не увидел endpointURI в intellisense, я не осознавал, что это свойство должно быть установлено.
Если вы посмотрите на источник для AbstractWebserivce, (http://opensource.adobe.com/svn/opensource/flex/sdk/trunk/frameworks/projects/rpc/src/mx/rpc/soap/AbstractWebService.as), похоже, нет тега Exclude, объясняющего, почему endpointURI не появляется в контекстном меню Intellisense. Поэтому я не знаю, что происходит там.