2017-06-01 146 views
0

我有调用WCF服务的MVC客户端。 MVC客户端需要在httprequest中传递一个自定义标头。 MVC客户端也使用Unity for DI。如何将http头添加到WCF通道

我已经通过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

1-下面的代码应该从MVC

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

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

2-发送SOAP头和这个码应该看它在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。