如何将http标头添加到WCF通道

时间:2017-06-01 16:16:25

标签: wcf wcf-binding wcf-security

我有调用WCF服务的MVC客户端。 MVC客户端需要在httprequest中传递一个自定义头。 MVC客户端也使用Unity for DI。

我已经浏览了SO POST和其他链接,但他们都建议使用消息检查器和自定义行为(这可能是正确的方法),但我正在寻找快速和肮脏的方式,因为这将是临时解决方案。

    // 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
    }

在上面的代码中,如何在创建频道后添加自定义标题?

1 个答案:

答案 0 :(得分:1)

1-下面的代码应该从MVC发送soap标头

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

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

2-此代码应在WCF上阅读

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

3-对于频道,我建议您按如下方式创建自定义System.ServiceModel.ClientBase:

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-创建一个继承自UserClientBase的自定义客户端类,并在内部使用基本通道来调用您的IxxService,这是T。

相关问题