2017-07-26 65 views
0

我需要從C#代碼中實現一種反向代理。 (是的,我知道,IIS有一個反向代理,但有幾個原因,我需要從代碼做到這一點。)有沒有簡單的方法從入站請求創建新的出站HttpWebRequest?

所以,我的控制器行動將「接力」到另一個URL入站請求,然後返回響應。的種類是這樣的:

public string Proxy() 
{ 
    // This would be an extension method; it's currently hypothetical 
    var newRequest = Request.GetRequestToNewUrl("http://newurl.com"); 

    // Make the request and send back whatever we get 
    var response = newRequest.GetResponse(); 
    using (var reader = new StreamReader(response.GetResponseStream(), Encoding.Something)) 
    { 
     return reader.ReadToEnd(); 
    } 
} 

的代理請求(至newurl.com)應該是相同的,以將入站請求(標題,主體,餅乾等),只是不同的URL。

我一直在玩它,它比我想象的更復雜。入站RequestHttpRequestBase,代理請求將是HttpWebRequest。它們是根本不同的類型,兩者之間沒有直接的轉換。到目前爲止,複製和翻譯屬性是一個乏味的過程。

在我花費大量時間調試所有這些之前,有沒有更簡單的方法?有相當數量的不同類型來表示一個HTTP請求:

  • HttpRequestBase
  • HttpWebRequest
  • HttpRequest
  • HttpRequestWrapper

有沒有一種方法,我不知道到只需「重新使用」入站請求,同時更改URL?或者我應該繼續從我的翻譯HttpRequestBase

回答

0

是的,這是可能的。您可以重複傳入請求中的請求內容,並通過創建您自己的新請求來轉發它。用請求被轉發的地址創建一個新的客戶端。用新的HTTP客戶端進行獲取或發佈,然後返回結果。

var client = new HttpClient 
{ 
    BaseAddress = new Uri(destinationBaseAddress) 
}; 

return await client.PostAsync(requestUrl, Request.Content); 
+0

這是否複製了所有HTTP標頭? – Deane

+0

是的,它裏面有一個Headers屬性Request.Content.Headers – Shahzad

相關問題