2009-08-06 4 views
6

Ich versuche, die System.Net.HttpWebRequest Klasse zu verwenden, um eine HTTP-GET-Anfrage an einen bestimmten Web-Server für Webanwendungen, die wir über zahlreiche Server ausgeglichen haben. Um dies zu erreichen, muss ich in der Lage sein, den Host-Header-Wert für die Anfrage zu setzen, und das konnte ich mit der Klasse System.Net.WebProxy erreichen.Wie setze ich einen Host-Header-Wert für SSL-Anfragen mit HttpWebRequest

Allerdings bricht dies alles zusammen, wenn ich versuche, ein GET mit SSL durchzuführen. Wenn ich dies versuche, löst der Aufruf von HttpWebRequest.GetResponse eine System.Net.WebException mit einem HTTP-Statuscode von 400 (Bad Request) aus.

Was versuche ich mit HttpWebRequest zu erreichen, oder sollte ich nach einem alternativen Weg suchen, um das zu leisten, was ich will?

Hier ist der Code, den ich verwendet habe, dies zu versuchen und erhalten Sie alle zu arbeiten: -

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

Echte Frage: Woher wissen Sie, dass Sie einen Host-Header benötigen? "HTTP 1.1-Hostheader werden bei Verwendung von SSL nicht unterstützt" http://support.microsoft.com/kb/187504. – russau

+0

Zweiter Gedanke: Können Sie die Datei über SSL in einem Browser abrufen? – russau

+1

Ich muss einen Host-Header festlegen, damit ich den genauen Server angeben kann, der betroffen ist, wenn die Webanwendung auf mehrere Server verteilt ist. Dieser Code ist Teil eines Web-Monitoring- und Testing-Frameworks, an dem ich schreibe. Und ja, die SSL-Anfragen, die ich versuche zu machen, funktionieren im Browser, so liegt das Problem irgendwo in der Art, wie ich ähnliche Funktionalität im Code implementieren möchte. Der Artikel, den Sie verlinkt haben, schlägt vor, dass die Host-Header-Unterstützung für SSL-Anforderungen in Windows Server 2003 SP1 verfügbar gemacht wurde und alle unsere Server vollständig gepatcht sein sollten. – Cleggy

Antwort

2

ich vor ein Hacky Ansatz verwendet haben - von einer Test exe hat, die meine „hosts“ ändert Datei, die einen Eintrag für den Farmnamen an die Adresse des spezifischen Servers schreibt (und einen ipconfig /flushdns ausgibt). Danach sollten Anfragen an den richtigen Server weitergeleitet werden, als wäre es der einzige Server.

Offensichtlich erfordert dies Admin-Zugriff ... Ich benutze es als Teil eines automatisierten Rauch-Tests, um die Farm als ob es einzelne Maschinen waren.

Die andere Sache, die Sie versuchen könnten, ist etwas auf dem NLB, vielleicht in TCL (im Fall von F5) - vielleicht fügen Sie einen benutzerdefinierten Header, den der NLB versteht? (Angenommen, SSL wird erneut signiert).

+0

Danke für den Vorschlag, aber das wird bei uns nicht funktionieren. Wir werden mehrere Threads zur selben Zeit ausführen, und in diesem Szenario könnten definitiv HOSTS-Zugriffskonflikte auftreten. –

0

In .NET 4.0 kann der Host-Header unabhängig von der URL, die die Anfrage wird, festgelegt werden, so würde ich empfehlen, dass Sie HttpwebRequest.Host verwenden, um Ihr Problem zu lösen. Dies (ich denke) wird als Teil von .NET 4.0 beta2 ausgeliefert. Es gibt KEINE Möglichkeit, den Host-Header anders als in früheren Versionen von .NET neu zu schreiben, ohne dass Sie Ihre eigene benutzerdefinierte Unterklasse von WebRequest implementiert haben (glauben Sie mir, es wurde versucht).

Verwandte Themen