I am trying to add a custom header for all SOAP requests through WCF. I found this fantastic article on how to do this. My MessageHeader class is as follows:
public class OperatorNameMessageHeader : MessageHeader { private string opName; public const string HeaderName = "OperatorNameMessageHeader"; public const string HeaderNamespace = "http://schemas.microsoft.com/scout"; public override string Name { get { return HeaderName; } } public override string Namespace { get { return HeaderNamespace; } } public string OperatorName { get { return opName; } set { opName = value; } } public OperatorNameMessageHeader() { } public OperatorNameMessageHeader(string operatorName) { opName = operatorName; } protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion) { writer.WriteElementString("OperatorName", opName); } }
One article does not say how to read the value on the server. According to this post, you can use OperationContext.Current.IncomingMessageHeaders to read these headers. When I look at these MessageHeaders under the debugger, I see 3 headers, including my own. Thus, it is definitely mapped to SOAP data. However, when I call GetHeader :
OperatorNameMessageHeader test = msgHeaders.GetHeader<OperatorNameMessageHeader>(OperatorNameMessageHeader.HeaderName, OperatorNameMessageHeader.HeaderNamespace);
Then test.OperatorName is null. Basically, I just return an empty OperatorNameMessageHeader object that has not been deserialized from the data in SOAP.
My next step was to start the WCF tracer. When I do this, I can verify that the custom header is indeed sent through the wire:
<MessageHeaders> <ActivityId CorrelationId="66a7c5b6-3548-4f3c-9120-4484af76b64b" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">f9bef03b-4e7b-4e84-b327-5e79814d9933</ActivityId> <OperatorNameMessageHeader xmlns="http://schemas.microsoft.com/scout"> <OperatorName>Correct Operator Name</OperatorName> </OperatorNameMessageHeader> <To d4p1:mustUnderstand="1" xmlns:d4p1="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:90/IRolesAndResourcesManager</To> <Action d4p1:mustUnderstand="1" xmlns:d4p1="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IRolesAndResourcesManager/Authenticate</Action> </MessageHeaders>
So, the server has data, I just canβt get to it. What is the solution to this problem?
source share