2009-08-06 13 views
6

System.Net.HttpWebRequestクラスを使用して、多数のサーバーで負荷分散されたWebアプリケーション用の特定のWebサーバーに対してHTTP GET要求を実行しようとしています。これを実現するには、リクエストのHostヘッダー値を設定できる必要があります。これをSystem.Net.WebProxyクラスを使用して実現できました。HttpWebRequestを使用してSSLリクエストのホストヘッダー値を設定する方法

ただし、SSLを使用してGETを実行しようとすると、これはすべて停止します。私がこれをしようとすると、HttpWebRequest.GetResponseの呼び出しは、HTTPステータスコードが400(Bad Request)のSystem.Net.WebExceptionをスローします。

私は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

+0

2番目の考え:ブラウザでSSL経由でファイルを取得できますか? – russau

+1

Webアプリケーションが複数のサーバー間で負荷分散されている場合、正確なサーバーを指定できるように、ホストヘッダーを設定する必要があります。このコードは、私が作成しているWeb監視とテストのフレームワークの一部です。 はい、私がしようとしているSSLリクエストはブラウザで動作するので、問題はコードの中で同様の機能を実装しようとしています。リンクした記事では、SSL要求のホストヘッダーサポートがWindows Server 2003 SP1で利用可能になり、すべてのサーバーに完全にパッチを適用する必要があることが示唆されています。 – Cleggy

答えて

2

私は前にハックアプローチを使用しました - - 私の「ホスト」を変更するテストexeファイルを持つ:ここで

は、私が仕事に、このすべてを試してみて、取得するために使用してきたコードです特定のサーバーのアドレスにファーム名のエントリを挿入します(ipconfig /flushdnsを発行します)。その後、リクエストは正しいサーバーにルーティングされる必要があります。

これは明らかに管理者のアクセス権が必要です...私はそれを個々のマシンであるかのようにファームに当たる自動化されたスモークテストの一部として使用します。

もう1つ、NLB上の何か、おそらくTCL(F5の場合) - おそらくNLBが理解できるカスタムヘッダーを追加しますか? (SSL再署名を行っていると仮定します)。

+0

提案していただきありがとうございますが、それは私たちにとってはうまくいかないでしょう。我々は同時に複数のスレッドを実行しており、そのシナリオではHOSTSエントリの競合が発生する可能性があります。 –

0

.NET 4.0では、要求を行うURLとは独立してホストヘッダーを設定できるため、問題を解決するためにHttpwebRequest.Hostを使用することをお勧めします。これは.NET 4.0 beta2の一部として出荷されると思います。 WebRequestの独自のカスタムサブクラスを実装せずに、以前のバージョンの.Netでホストヘッダーを別のものに書き換える方法はありません。