2011-06-27 45 views
3

我有一個C#WCF服務接收請求消息並將其發佈到另一個服務。 發佈到其他服務是通過HttpWebRequest完成的。 如何在我的服務中獲取原始請求HTTP標頭,並將它們放入HttpWebRequest中,然後將其發佈到其他服務中。將HTTP請求/響應頭從一個調用複製到HttpWebRequest?

事情是這樣的:

HttpRequestMessageProperty httpRequestProp = GetHttpRequestProp(requestMessage); 
HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(uri); 
    foreach (var item in httpRequestProp.Headers.AllKeys) 
      { 

       loHttp.Headers.Add(item, httpRequestProp.Headers[item]); 
      } 

我知道這行不通,因爲HttpWebRequest的loHttp都有自己的屬性,當我嘗試用上述方法來設置的ContentType例如,因爲它需要拋出異常設置這樣的:

loHttp.ContentType = httpRequestProp.Headers[HttpRequestHeader.ContentType]; 

那麼,有沒有辦法HTTP請求頭從呼叫HTTP請求頭複製,並把它們作爲另一個HttpWebRequest的?原始請求也可能有其他自定義標頭設置,我想將這些也發送到其他服務。

謝謝 Adrya

回答

5

您可以通過

OperationContext.Current.RequestContext.RequestMessage.Headers 

得到標題您可以通過

WebClient.Headers 

例設置標題:

WebClient wc = new WebClient(); 
wc.Headers.Add("referer", "http://yourwebsite.com"); 
wc.Headers.Add("user-agent", "Mozilla/5.0"); 

但是,要明白某些標題是受限制的,不能自由修改。它們是:

  • 接受
  • 連接
  • 內容長度
  • 內容類型
  • 日期
  • 期待
  • 主機
  • 如果-Modified-Since的
  • 範圍
  • Referer的
  • 傳輸編碼
  • 的User-Agent
  • 代理連接

,我想你應該看看,逐案,這頭可以可/要從來電來複制即將離任的人。

+0

我知道如何獲取標題,我不知道如何設置他們在我發佈到其他服務的HttpWebRequest ... – Adrya

+0

正如羅伊所說,一些標題是受保護的,只能通過屬性設置。所以,你給出的循環是好的,除了你將不得不有一些特殊的條件,如果例如頭部名稱是Content-Length,你直接設置屬性而不是請求頭部 – feroze

+0

@Roy,請您提供了您列出的「受限制」標題列表的來源 - 它是否在RFP中? –

0

例如,要將所有請求頭複製到HttpWebRequest的標題:

HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url); 
CopyHeaders(httpWebRequest, httpWebRequest.Headers, this.Request.Headers); 

和實施:

void CopyHeaders(object rootTo, NameValueCollection to, NameValueCollection from) 
    { 
     foreach (string header in from.AllKeys) 
     { 
      try 
      { 
       to.Add(header, from[header]); 
      } 
      catch 
      { 
       try 
       { 
        rootTo.GetType().GetProperty(header.Replace("-", "")).SetValue(rootTo, from[header]); 
       } 
       catch {} 
      } 
     } 
    } 

希望它能幫助。