如何在flex web服务调用中添加“flat”消息头?

时间:2009-08-07 22:21:36

标签: flex web-services

我有一个Flex客户端连接到一个Web服务,该服务需要添加一个身份验证令牌作为标题,名为“Identity”。预期消息的一个示例是:

<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 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。我个人更喜欢覆盖本机SOAPEncoder类,它允许您在发送之前访问实际的soap信封。这使您可以进行更多控制并添加诸如ws-addressing和自定义身份验证标头之类的内容。

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;
    }


    }
}

然后,您需要做的就是将默认编码器更改为此编码器,如果您使用生成Web服务类转到serviceBase并查找方法“Call”并将此行更改为此

var enc:SOAPEncoder = new myEncoder(); //而不是这个 - &gt; new SOAPEncoder();

如果不是像myService.encoder = new myEncoder();

那样的东西

就这么简单。

显然,覆盖编码器类可以提供更多控制。您也可以对SOAPDecoder类执行相同的操作,以便在反序列化之前捕获soap信封。

希望这有帮助

乔恩