LP13
LP13

Reputation: 34149

How to add http header into WCF channel

I have MVC client that invokes a WCF service. The MVC client needs to pass one custom header in httprequest. The MVC client is also using Unity for DI.

I have already gone through SO POST and others links but they are all suggesting to use message inspector and custom behavior(which might be the correct way) but i'm looking for quick and dirty way because this will be temporary solution.

    // Unity type Registration
    public static void RegisterTypes(IUnityContainer container)
    {
       container.RegisterType<IDocumentManagementChannel>(new PerRequestLifetimeManager(),
            new InjectionFactory(f=> CreateDocumentManagementChannel()));
    }

    private static IDocumentManagementChannel CreateDocumentManagementChannel()
    {

        var factory = new ChannelFactory<IDocumentManagementChannel>("BasicHttpEndPoint");
        var channel =  factory.CreateChannel();

        // How do i add HttpHeaders into channel here?

        return channel
    }

In the code above How do i add custom header after i create a channel?

Upvotes: 2

Views: 1599

Answers (1)

Houssam Hamdan
Houssam Hamdan

Reputation: 908

1- Below code should send the soap header from MVC

            string userName = Thread.CurrentPrincipal.Identity.Name;
            MessageHeader<string> header = new MessageHeader<string>(userName);               

            OperationContext.Current.OutgoingMessageHeaders.Add(
                                      header.GetUntypedHeader("String", "System"));

2- And this code should read it on WCF

  string loginName = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>("String", "System");

3- As for the channel, i recommend you create your custom System.ServiceModel.ClientBase as follows:

public abstract class UserClientBase<T> : ClientBase<T> where T : class
    {
        public UserClientBase()
        {
            string userName = Thread.CurrentPrincipal.Identity.Name;
            MessageHeader<string> header = new MessageHeader<string>(userName);

            OperationContext.Current.OutgoingMessageHeaders.Add(
                                      header.GetUntypedHeader("String", "System"));
        }
    }

4- Create a custom client class that inherits from UserClientBase and use the base channel internally to call your IxxService which is the T here.

Upvotes: 2

Related Questions