本文介绍了如何添加“平面”消息头到Flex Web服务调用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Flex客户端连接到一个Web服务,需要一个名为Identity的头添加了一个身份验证令牌。预期的消息的一个例子是:

 < s:Envelope xmlns:s =http://schemas.xmlsoap。组织/肥皂/信封/> 
< s:Header>
< Identity xmlns =ns> 2188dcbe-0325-4c1e-9a77-19110e0ea99f< / Identity>
< Action s:mustUnderstand =1xmlns =http://schemas.microsoft.com/ws/2005/05/addressing/none> ns / MyService / MyOperation< / Action>
< / s:标题>
< s:Body>
...
< / s:Body>
< / s:Envelope>

如何在flex中添加这种头文件?我已经尝试使用.addHeader()和.addSimpleHeader,但这两个似乎添加子元素到头像元素:

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

我知道这应该是可能的,因为flex为To和Action头。 addHeader 似乎建议你可以给它原始的XML,但我还没有能够使它的工作。

预先感谢任何指针!

有几种方法可以做到这一点。我个人比较喜欢重写本地的SOAPEncoder类,它允许您在发送之前访问实际的SOAP信封。这使您能够拥有更多的控制权,并添加诸如ws-addressing和自定义验证标头之类的内容。

  public class myEncoder 
扩展SOAPEncoder
{

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

// ---------------------------------------- ----------------------------------
//
//构造函数
//
// ----------------------------------------- ---------------------------------
public function wsseEncoder()
{
super();
}

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

/ **
*< p>重写超类的方法,并接收原始肥皂消息来管理肥皂信封
*< / p>
* /
public override function encodeRequest(args:* = null,headers:Array = null):XML
{
//从超类获取soap信封
var SOAPEnvelope:XML = super.encodeRequest(args,headers);

//在xml中创建一个头文件并将其作为子文件追加
securityHeaderXml =< Security /> ;;
securityHeaderXml.setNamespace(WSSE_NS);
securityHeaderXml。@ [mustUnderstand] = 1;

// set deafult ws-security namespace - 过滤所有子节点
securityHeaderXml.setNamespace(WSSE_NS);

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

SOAPEnvelope.prependChild(headerXml);

返回SOAPEnvelope;







,那么你所需要做的就是把默认的编码器改成这个


var enc:SOAPEncoder = new myEncoder(); //代替这个 - > new SOAPEncoder();



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

就像这样简单。 / p>

显然,覆盖编码器类可以提供更多的控制权。您也可以使用SOAPDecoder类来捕获SOAP信封,然后将其反序列化。



希望这可以帮助您



Jon


I have a flex client connecting to a web service that needs an authentication token added as a header, named "Identity". An example of the expected message is:

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

How do I add this kind of header in flex? I've tried using both .addHeader() and .addSimpleHeader, but both of these seem to add sub-elements to the header element like:

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

I know this should be possible, since flex is doing this for the "To" and "Action" headers. The documentation for addHeader seems to suggest you can give it raw XML but I haven't been able to make it work.

Thanks in advance for any pointers!

解决方案

There's a couple of ways of doing it. I personally prefer overriding the native SOAPEncoder class which given you access to the actual soap envelope before it is sent. This enables you to have more control and add things like ws-addressing and custom authenication headers.

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


    }
}

Then all you need to do is change the default encoder to this one, if your using generate web service classes go to the serviceBase and look for the method 'Call' and change this line to this

var enc:SOAPEncoder = new myEncoder(); //instead of this -> new SOAPEncoder();

if not iots something like myService.encoder = new myEncoder();

As simple as that.

Obviously override the encoder class gives you alot more control. You can also do the same with the SOAPDecoder class to catch the soap envelope before it get de-serialised.

Hope this helps

Jon

这篇关于如何添加“平面”消息头到Flex Web服务调用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-21 05:30