Как добавить «плоский» заголовок сообщения к вызову гибкого веб-сервиса? - PullRequest
0 голосов
/ 08 августа 2009

У меня есть гибкий клиент, подключающийся к веб-сервису, которому требуется токен аутентификации, добавленный в качестве заголовка с именем «Идентичность». Пример ожидаемого сообщения:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <Identity xmlns="ns">2188dcbe-0325-4c1e-9a77-19110e0ea99f</Identity>
    <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">https://localhost:8001/MyService</To>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">ns/MyService/MyOperation</Action>
  </s:Header>
  <s:Body>
    ...
  </s:Body>
</s:Envelope>

Как добавить этот тип заголовка в flex? Я пытался использовать оба .addHeader () и .addSimpleHeader, но оба из них, кажется, добавляют подэлементы к элементу заголовка, как:

<Identity xmlns="ns">
  <Value>34234234-234-234-23-234324</Value>
</Identity>

Я знаю, что это должно быть возможно, так как flex делает это для заголовков "To" и "Action". Документация для addHeader , кажется, предполагает, что вы можете дать ему необработанный XML, но я не смог заставить его работать.

Заранее спасибо за любые указатели!

1 Ответ

1 голос
/ 08 августа 2009

Есть несколько способов сделать это. Я лично предпочитаю переопределять собственный класс SOAPEncoder, который предоставил вам доступ к фактическому конверту мыла перед его отправкой. Это позволяет вам лучше контролировать и добавлять такие вещи, как ws-адресация и пользовательские заголовки аутентификации.

public class myEncoder 
extends SOAPEncoder
{

private const WSSE_NS:Namespace = new Namespace("wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-secext-1.0.xsd");

    //--------------------------------------------------------------------------
    //
    // Constructor
    // 
    //--------------------------------------------------------------------------
    public function wsseEncoder()
    {
        super();
    }

    //--------------------------------------------------------------------------
    //
    // Methods
    // 
    //--------------------------------------------------------------------------

    /**
     * <p>  override super classes method and recieve raw soap message to manpulate soap envelope
     * </p>
     */
    public override function encodeRequest(args:* = null, headers:Array = null):XML
    {
        //get soap envelope from super class
        var SOAPEnvelope:XML = super.encodeRequest(args, headers);

               //create a header in xml and append it at as a child
        securityHeaderXml = <Security/>;
        securityHeaderXml.setNamespace(WSSE_NS);
        securityHeaderXml.@[mustUnderstand] = 1;

        //set deafult ws-security namespace - filters to all child nodes
        securityHeaderXml.setNamespace(WSSE_NS);

            var id:XML = <Identity/>;
            id.appendChild('value here');
            SOAPEnvelope.prependChild(id);

            SOAPEnvelope.prependChild(headerXml);

        return SOAPEnvelope;
    }


    }
}

Тогда все, что вам нужно сделать, это заменить кодировщик по умолчанию на этот, если вы используете классы генерации веб-служб, перейдите в serviceBase и найдите метод 'Call' и измените эту строку на

var enc: SOAPEncoder = new myEncoder (); // вместо этого -> new SOAPEncoder ();

если нет, то что-то вроде myService.encoder = new myEncoder ();

Так просто.

Очевидно, что переопределение класса кодировщика дает вам больше контроля. Вы также можете сделать то же самое с классом SOAPDecoder, чтобы поймать конверт с мылом перед его десериализацией.

Надеюсь, это поможет

Jon

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...