2009-08-06 52 views
6

我試圖使用System.Net.HttpWebRequest類來執行HTTP GET請求到一個特定的Web服務器爲我們的負載在衆多服務器平衡的Web應用程序設置SSL請求一個主機頭值。爲了實現這一點,我需要能夠爲請求設置主機頭值,並且我已經能夠通過使用System.Net.WebProxy類來實現此目的。如何使用HttpWebRequest的

但是,當我嘗試使用SSL執行GET時,這一切都會崩潰。當我嘗試這樣做時,對HttpWebRequest.GetResponse的調用將拋出一個System.Net.WebException,其HTTP狀態碼爲400(錯誤請求)。

是什麼,我想用HttpWebRequest的實現可能的,或者我應該尋找執行我想要什麼的另一種方式?

這是我一直在使用,試圖讓這一切工作的代碼: -

using System; 
using System.Web; 
using System.Net; 
using System.IO; 

namespace UrlPollTest 
{ 
    class Program 
    { 
     private static int suffix = 1; 
     static void Main(string[] args) 
     { 
      PerformRequest("http://www.microsoft.com/en/us/default.aspx", "www.microsoft.com"); 
      PerformRequest("https://www.microsoft.com/en/us/default.aspx", ""); 
      PerformRequest("https://www.microsoft.com/en/us/default.aspx", "www.microsoft.com"); 

      Console.WriteLine("Press any key to continue"); 
      Console.ReadKey(); 
     } 

     static void PerformRequest(string AUrl, string AProxy) 
     { 
      Console.WriteLine("Fetching from {0}", AUrl); 
      try 
      { 
       HttpWebRequest request = WebRequest.Create(AUrl) as HttpWebRequest; 
       if (AProxy != "") 
       { 
        Console.WriteLine("Proxy = {0}", AProxy); 
        request.Proxy = new WebProxy(AProxy); 
       } 

       WebResponse response = request.GetResponse(); 
       using (Stream httpStream = response.GetResponseStream()) 
       { 
        using (StreamReader reader = new StreamReader(httpStream)) 
        { 
         string s = reader.ReadToEnd(); 
         File.WriteAllText(string.Format("D:\\Temp\\Response{0}.html", suffix++), s); 
        } 
       } 
       Console.WriteLine(" Success"); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(" " + e.Message); 
      } 
     } 
    } 
} 
+0

正品問題:您如何知道您需要主機頭? 「使用SSL時不支持HTTP 1.1主機頭」http://support.microsoft.com/kb/187504。 – russau 2009-08-06 03:46:41

+0

第二個想法:你可以在瀏覽器上通過SSL獲取文件嗎? – russau 2009-08-06 03:52:30

+1

我需要設置一個主機頭,這樣我才能指定確切的服務器命中,如果Web應用程序在多個服務器之間進行負載均衡。此代碼是我正在編寫的Web監視和測試框架的一部分。 是的,我試圖使在瀏覽器中工作的SSL請求,所以問題在於我試圖在代碼中實現類似功能的方式。您鏈接的文章表明Host支持SSL請求的支持在Windows Server 2003 SP1中可用,並且我們所有的服務器都應該完全打補丁。 – Cleggy 2009-08-06 04:03:22

回答

2

我用了一個哈克方法之前 - 有一個測試EXE,它改變了我的「東道主」的文件,將農場名稱條目注入到特定服務器的地址(併發布ipconfig /flushdns)。之後,請求應該被路由到正確的服務器,就好像它是唯一的那個一樣。

顯然,這需要管理員訪問權限......我用它作爲一個自動化的煙霧測試打場,就好像是單個機器的一部分。

你可以嘗試其他的事情是在NLB的東西,也許在TCL(在F5的情況下) - 也許補充一點,NLB瞭解自定義標題? (假設它正在進行SSL重新簽名)。

+0

感謝您的建議,但這對我們不起作用。我們將同時運行多個線程,在這種情況下肯定會出現HOSTS輸入衝突。 – 2009-08-06 04:29:28

0

在.NET 4.0的主機頭可以獨立設置,該請求是要,所以我會建議您使用HttpwebRequest.Host來解決問題的URL。這(我認爲)將作爲.NET 4.0 beta2的一部分發布。在沒有實現自己的WebRequest自定義子類的情況下,沒有辦法在以前版本的.Net下重新編寫主機頭文件(相信我,它已被嘗試過)。