2010-03-15 1 views
5

ich eine benutzerdefinierte SOAP-Header erstellt haben, und sie in meine Nachricht über IClientMessageInspector hinzugefügtWie bekomme ich den Wert einer benutzerdefinierten SOAP-Header in 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; } 
    } 

ich auch eine IDispatchMessageInspector haben, und ich kann das finden korrekte Überschrift in der Liste. Es gibt jedoch keinen Wert. Ich weiß, dass der Wert über den Draht ging richtig, weil die Nachrichtenzeichenfolge korrekt ist

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

Aber es scheint keine Eigenschaft, um diesen Wert abzurufen. Die MessageHeaderInfo-Klasse hat Actor usw., aber nichts anderes kann ich finden.

Auf der Clientseite musste ich zwischen Header und Untyped Header konvertieren, gibt es eine gleichwertige Operation auf dem Server?

Ich fand folgendes, was funktionieren sollte.

Wenn ich den richtigen Index manuell finde und die zweite Zeile aufrufen, funktioniert es wie erwartet. FindHeader gibt jedoch -1 als Index zurück, obwohl ich im Überwachungsfenster bestätigt habe, dass dies die richtigen Werte für den Namen und den Namespace sind.

Antwort

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

Ich denke, dass Sie als dritten Parameter der Schauspieler auf die Funktion FindHeader hinzufügen müssen

Verwandte Themen