【问题标题】:How to add http header into WCF channel如何将 http 标头添加到 WCF 通道中
【发布时间】:2017-06-01 16:16:24
【问题描述】:

我有调用 WCF 服务的 MVC 客户端。 MVC 客户端需要在 httprequest 中传递一个自定义标头。 MVC 客户端也使用 Unity 进行 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
    }

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

【问题讨论】:

    标签: wcf wcf-binding wcf-security


    【解决方案1】:

    1- 下面的代码应该从 MVC 发送肥皂头

                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。

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 2012-08-14
      • 2017-10-15
      • 2012-01-04
      相关资源
      最近更新 更多