2009-08-06 3 views
6

Sto cercando di utilizzare la classe System.Net.HttpWebRequest per eseguire una richiesta HTTP GET a un server Web specifico per applicazioni Web che abbiamo il carico bilanciato su numerosi server. Per raggiungere questo obiettivo, devo essere in grado di impostare il valore dell'intestazione host per la richiesta e sono riuscito a ottenere ciò utilizzando la classe System.Net.WebProxy.Come impostare un valore di intestazione host per richieste SSL utilizzando HttpWebRequest

Tuttavia, tutto questo si interrompe quando provo a eseguire un GET utilizzando SSL. Quando provo a farlo, la chiamata a HttpWebRequest.GetResponse lancia un System.Net.WebException, con un codice di stato HTTP di 400 (Bad Request).

È ciò che sto cercando di ottenere con HttpWebRequest, o dovrei cercare un modo alternativo per eseguire ciò che voglio?

Ecco il codice che ho usato per cercare di ottenere tutto questo a lavorare: -

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

Vera domanda: come fai a sapere che hai bisogno di un host-header? "Le intestazioni host HTTP 1.1 non sono supportate quando si utilizza SSL" http://support.microsoft.com/kb/187504. – russau

+0

Secondo pensiero: puoi ottenere il file su SSL in un browser? – russau

+1

Ho bisogno di impostare un'intestazione Host in modo da poter specificare il server esatto da colpire se l'applicazione web viene bilanciata in carico su più server. Questo codice è parte di un framework di monitoraggio e testing web che sto scrivendo. E sì, le richieste SSL che sto tentando di far funzionare funzionano nel browser, quindi il problema sta da qualche parte nel modo in cui sto tentando di implementare funzionalità simili nel codice. L'articolo collegato ti suggerisce che il supporto dell'intestazione host per le richieste SSL è stato reso disponibile in Windows Server 2003 SP1 e che tutti i nostri server dovrebbero essere completamente aggiornati. – Cleggy

risposta

2

ho usato un approccio hacky prima - di avere un exe test che modifica i miei "padroni di casa" file, inserendo una voce per il nome della farm all'indirizzo del server specifico (ed emettendo uno ipconfig /flushdns). Successivamente, le richieste dovrebbero essere indirizzate al server giusto come se fosse l'unico lì.

Ovviamente questo richiede l'accesso di amministratore ... Io lo uso come parte di un test di fumo automatizzato per colpire la fattoria come se si trattasse di singole macchine.

L'altra cosa che potresti provare è qualcosa sul NLB, forse in TCL (nel caso di F5) - magari aggiungere un'intestazione personalizzata che l'NLB comprende? (supponendo che stia facendo la firma SSL).

+0

Grazie per il suggerimento, ma questo non funzionerà per noi. Eseguiremo più thread contemporaneamente e potrebbero esserci conflitti di voce HOSTS in quello scenario. –

0

In .NET 4.0 l'intestazione dell'Host può essere impostata indipendentemente dall'URL in cui si trova la richiesta, quindi ti consiglio di utilizzare HttpwebRequest.Host per risolvere il tuo problema. Questo (penso) verrà fornito come parte di .NET 4.0 beta2. Non c'è modo di riscrivere l'intestazione host per essere diversi nelle precedenti versioni di .Net senza implementare la propria sottoclasse personalizzata di WebRequest (credetemi, è stato provato).