2010-03-15 17 views
5

J'ai créé un en-tête de savon personnalisé, et a ajouté dans mon message via IClientMessageInspectorComment j'obtenir la valeur d'un en-tête de savon personnalisé dans WCF

public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) 
    { 
     var header = new MessageHeader<AuthHeader>(); 
     header.Content = new AuthHeader(Key); 
     header.Actor = "Anyone"; 
     var header2 = header.GetUntypedHeader("Auth", "xWow"); 
     request.Headers.Add(header2); 
     return null; 
    } 

    [DataContract(Name="Auth")] 
    public class AuthHeader 
    { 
     public AuthHeader(string key) 
     { 
      this.Key = key; 
     } 

     [DataMember] 
     public string Key { get; set; } 
    } 

J'ai aussi un IDispatchMessageInspector, et je peux trouver corriger l'en-tête dans la liste. Cependant, il n'y a pas de valeur. Je sais que la valeur a traversé le fil correctement, car la chaîne de message est correct

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header> 
     <Auth s:actor="Anyone" xmlns="xWow" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
      <Key xmlns="http://schemas.datacontract.org/2004/07/xWow.Lib">HERE IS MY KEY VALUE!!!!</Key> 
     </Auth> 
     <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:26443/AuthService.svc</To> 
     <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IAuthService/GetPayload</Action> 
    </s:Header> 
    <s:Body> 
     <GetPayload xmlns="http://tempuri.org/"/> 
    </s:Body> 
</s:Envelope> 

Mais il ne semble pas être une propriété pour récupérer cette valeur. La classe MessageHeaderInfo a Actor, etc, mais rien d'autre d'utile que je peux trouver.

Du côté client, j'ai dû convertir entre en-tête et en-tête non typé, y a-t-il une opération équivalente sur le serveur?

J'ai trouvé ce qui suit, ce qui devrait fonctionner.

request.Headers.FindHeader("Auth", "xWow"); 
request.Headers.GetHeader<AuthHeader>(index); 

Si je trouve manuellement le bon index et appelle la deuxième ligne, cela fonctionne comme prévu. Cependant FindHeader retourne -1 comme index, même si j'ai confirmé dans la fenêtre de surveillance que ce sont les valeurs correctes pour le nom et l'espace de noms.

Répondre

6
request.Headers.FindHeader("Auth", "xWow"); 
request.Headers.GetHeader<AuthHeader>(index); 
4
HttpRequestMessageProperty requestProperty = 
    (HttpRequestMessageProperty)OperationContext.Current 
     .IncomingMessageProperties[HttpRequestMessageProperty.Name]; 

string contextToken = requestProperty.Headers["MyCustomHeader"]; 
1

Je pense que vous devez ajouter au troisième paramètre l'acteur sur la fonction FindHeader