2017-06-01 150 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。