WCF: Creating Custom Headers, How To Add and Consume Those Headers
When creating a C# WCF service (version .Net 3.0 and above) there may be a value in identifying the clients (consumers) which a web service is providing operational support to. This article demonstrates in C# and config Xml how to have clients identify themselves and pass pertinent information within the soap message’s header. That information in turn will be processed by the Web Service accordingly.
Client Identifies Itself
The goal here is to have the client provide some sort of information which the server can use to determine who is sending the message. The following C# code will add a header named `ClientId
`:
var cl = new ActiveDirectoryClient(); var eab = new EndpointAddressBuilder(cl.Endpoint.Address); eab.Headers.Add( AddressHeader.CreateAddressHeader("ClientId", // Header Name string.Empty, // Namespace "OmegaClient")); // Header Value cl.Endpoint.Address = eab.ToEndpointAddress(); // Now do an operation provided by the service. cl.ProcessInfo("ABC");
What that code is doing is adding an endpoint header named `ClientId
` with a value of `OmegaClient
` to be inserted into the soap header without a namespace.
Custom Header in Client’s Config File
There is an alternate way of doing a custom header. That can be achieved in the Xml config file of the client where all messages sent by specifying the custom header as part of the endpoint as so:
<configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IActiveDirectory" /> </basicHttpBinding> </bindings> <client> <endpoint address="http://localhost:41863/ActiveDirectoryService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IActiveDirectory" contract="ADService.IActiveDirectory" name="BasicHttpBinding_IActiveDirectory"> <headers> <ClientId>Console_Client</ClientId> </headers> </endpoint> </client> </system.serviceModel> </configuration>
The above config file is from a .Net 4.5 client.
Server Identifies Client Request
Finally the web service will read the custom header and distinquish between any WCF client and process it accordingly.
var opContext = OperationContext.Current; // If this is null, is this code in an async block? If so, extract it before the async call. var rq = opContext.RequestContext; var headers = rq.RequestMessage.Headers; int headerIndex = headers.FindHeader("ClientId", string.Empty); var clientString = (headerIndex < 0) ? "UNKNOWN" : headers.GetHeader<string>(headerIndex);