How to I get the value of a custom soap header in WCF
Solution 1
request.Headers.FindHeader("Auth", "xWow");
request.Headers.GetHeader<AuthHeader>(index);
Solution 2
HttpRequestMessageProperty requestProperty =
(HttpRequestMessageProperty)OperationContext.Current
.IncomingMessageProperties[HttpRequestMessageProperty.Name];
string contextToken = requestProperty.Headers["MyCustomHeader"];
Solution 3
I think that you need to add as third parameter the actor on the function FindHeader
Comments
-
Jason Coyne about 2 years
I have created a custom soap header, and added it into my message via IClientMessageInspector
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; } }
I also have an IDispatchMessageInspector, and I can find the correct header in the list. However, there is no value. I know that the value went across the wire correctly, because the message string is 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>
But there does not seem to be any property to retrieve this value. The MessageHeaderInfo class has Actor, etc, but nothing else useful I can find.
On the client side I had to convert between Header and Untyped header, is there an equivalent operation on the server?
I found the following, which should work.
request.Headers.FindHeader("Auth", "xWow"); request.Headers.GetHeader<AuthHeader>(index);
If I manually find the right index and call the second line, it works as expected. However FindHeader is returning -1 as the index, even though I have confirmed in the watch window that those are the correct values for the name and namespace.