2009-08-07 3 views
0

J'ai un client Flex se connectant à un service Web qui a besoin d'un jeton d'authentification ajouté en tant qu'en-tête, nommé "Identity". Un exemple du message attendu est:Comment ajouter un en-tête de message "plat" à un appel de service Web Flex?

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

Comment ajouter ce type d'en-tête dans flex? Je l'ai essayé d'utiliser les deux .addHeader() et .addSimpleHeader, mais ces deux semblent ajouter des sous-éléments à l'élément d'en-tête comme:

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

Je sais que cela devrait être possible, puisque flex fait cela pour les en-têtes "À" et "Action". La documentation pour addHeader semble suggérer que vous pouvez lui donner du XML brut mais je n'ai pas réussi à le faire fonctionner.

Merci d'avance pour les pointeurs!

Répondre

1

Il y a plusieurs façons de le faire. Personnellement, je préfère ignorer la classe native SOAPEncoder qui vous donne accès à l'enveloppe de savon réelle avant qu'elle ne soit envoyée. Cela vous permet d'avoir plus de contrôle et d'ajouter des choses comme les en-têtes ws-adressage et les authentifications personnalisées.

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); 
     [email protected][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; 
    } 


    } 
} 

Alors tout ce que vous devez faire est de changer l'encodeur par défaut à celui-ci, si vous utilisez générer des classes de service Web aller à la ServiceBase et chercher la méthode « appel » et changer cette ligne à cette

var enc: SOAPEncoder = new myEncoder(); // au lieu de cela -> nouveau SOAPEncoder();

sinon iots quelque chose comme myService.encoder = new myEncoder();

Aussi simple que cela. Évidemment, outrepasser la classe d'encodeur vous donne beaucoup plus de contrôle. Vous pouvez également faire la même chose avec la classe SOAPDecoder pour attraper l'enveloppe de savon avant qu'elle ne soit désérialisée.

Hope this helps

Jon

Questions connexes