问题描述
我有一个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>
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服务调用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!