Search code examples
c#web-serviceswcfsoapapi-key

Adding Http Header in an existing WCF SOAP Service is not working


I would like to an HTTP header to my WCF SOAP Service. My end goal is to send API keys through this HTTP header.

Below is my code:

[ServiceBehavior(Namespace = "http://****.com/**/1.1")]
public class MyWcfSvc : IMyVerify
{
    const int MaxResponseSize = 0xffff; // 64K max size - Normally it will be MUCH smaller than this

    private static readonly NLogLogger Logger;

    static MyWcfSvc()
    {
        Logger = new NLogLogger();
        // Add an HTTP Header to an outgoing request 
        HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
        requestMessage.Headers["User-Auth"] = "MyHttpHeaderValue";
        OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
    }
}

I do not see User-Auth header under HTTP request headers.

I also tried with another way.

public AnalyzeResponse Analyze(AnalyzeRequest analyzeRequest)
    {
        HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
        requestMessage.Headers["User-Auth"] = "MyHttpHeaderValue";
        OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
.
.
. Rest of the service implementation
.
.
.
}

But, still, I don't see any HTTP header information with the request message. I am using SOAP UI to send the requests and to view the responses.

How should I go about this? Am I suppose to make changes to the Service related to class? Or I need to make some changes to web.config file?


Solution

  • SOAP Header

    To add a SOAP header, use the following code client-side:

    using (OperationContextScope scope = new OperationContextScope((IContextChannel)channel))
    {
        MessageHeader<string> header = new MessageHeader<string>("MyHttpHeaderValue");
        var untyped = header.GetUntypedHeader("User-Auth", ns);
        OperationContext.Current.OutgoingMessageHeaders.Add(untyped);
    
        // now make the WCF call within this using block
    }
    

    And then, server-side, grab it using:

    MessageHeaders headers = OperationContext.Current.IncomingMessageHeaders;
    string identity = headers.GetHeader<string>("User-Auth", ns);
    

    NB. ns is The namespace URI of the header XML element.

    HTTP Header

    To add an Http header:

    // Add a HTTP Header to an outgoing request 
    HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
    requestMessage.Headers["MyHttpHeader"] = "MyHttpHeaderValue";
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
    

    And to grab it server-side

    IncomingWebRequestContext request = WebOperationContext.Current.IncomingRequest; 
    WebHeaderCollection headers = request.Headers; 
    Console.WriteLine(request.Method + " " + request.UriTemplateMatch.RequestUri.AbsolutePath); 
    
    foreach (string headerName in headers.AllKeys)
    { 
        Console.WriteLine(headerName + ": " + headers[headerName]); 
    }