2016-02-26 40 views
4

我有一個WCF服務,它需要將應用程序ID參數傳遞給每個服務調用。目前我公開的方法需要一個參數。我想嘗試將這些信息推送到頻道標題中。我的WCF使用Net.tcp託管。這裏是我的客戶代理代碼:在通過頻道傳遞標題值時使用WCF OperationContext

public class CustomerClient : ClientBase<ICustomerBrowser>, ICustomerBrowser 
{ 
    public Customer Get(string ApplicationID, string CustomerId) 
    { 
    try 
    { 
     using (OperationContextScope _scope = new OperationContextScope(this.InnerChannel)) 
     { 
      MessageHeader _header = MessageHeader.CreateHeader("AppID", string.Empty, ApplicationId); 
      OperationContext.Current.OutgoingMessageHeaders.Add(_header); 
      return Channel.Get(ApplicationId, CustomerId); 
      // return Channel.Get(CustomerId); 
     } 
    } 
    } 
} 

(註釋掉的線是我想要使用的前進)。

Server代碼:

var _context = WebOperationContext.Current; 
var h = _context.IncomingRequest.Headers; 

在_context對象有包含我的頭私有方法,但公開的_context.IncomingRequest.Headers我得到這個:

There is no HttpRequestMessageProperty on the incoming Message. 

所以我的問題是,我是否受苦,因爲我沒有託管HTTP?有沒有辦法欺騙服務器讓我通過添加一些僞HTTP頭來訪問這些頭文件?或者我可以通過反思得到私人成員?

回答

3

您正在使用OperationContext的錯誤實例。

WebOperationContext專門用於通過http傳輸的消息。它期望它的頭文件具有一個指定的名稱。在WebOperationContext的情況下,MessageHeaders字典需要一個名爲httpRequest的密鑰,該密鑰在您的方案中未提供。

當你正在使用標準OperationContext客戶端應該做同樣的服務器端:

var _context = OperationContext.Current; 
var headers = _context.IncomingMessageHeaders; 
foreach (MessageHeaderInfo h in headers) 
{ 
    if (h.Name == "AppID") { 
     Debug.WriteLine(h.ToString()); 
    } 
} 
+0

小學生的錯誤!謝謝,但是現在我面臨的問題是看不到值被傳遞 - 我得到一個類型的System.ServiceModel.Channels.HeaderInfoCache + HeaderInfo的值,而不是MessageHeader ... –

+2

嘗試'_context.IncomingMessageHeaders.GetHeader (。 ..)'方法 –

+0

完美!謝謝 –