Настройка конечной точки WebServiceWrapper во время выполнения - PullRequest
3 голосов
/ 18 сентября 2010

Я нахожусь в процессе перехода от Flex Builder 3 к Flash Builder 4, и одна из проблем, с которыми я столкнулся, заключается в том, что поддержка веб-служб в 4 существенно отличается. В обеих IDE я могу импортировать WSDL для моего веб-сервиса, и он будет генерировать соответствующие клиентские классы для взаимодействия с сервисом. Сгенерированный код в каждом отличается.

В моем коде Flex3 я смог получить доступ к свойству endpointURI mx.rpc.soap.AbstractWebService, но в генерируемом коде 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?

Ответы [ 3 ]

4 голосов
/ 20 сентября 2010

Краткий ответ:

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. Поэтому я не знаю, что происходит там.

0 голосов
/ 15 августа 2013

Это единственный способ заставить его работать в сгенерированном заглушке для вашего сервиса:

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();  
0 голосов
/ 18 сентября 2010

Вы должны иметь возможность переопределить endpointURI в WebService. Но я не уверен, где это сделать с сгенерированным кодом, так как я использую <s:WebService/>.

...