2009-08-06 12 views
6

Estoy tratando de usar la clase System.Net.HttpWebRequest para realizar una solicitud HTTP GET a un servidor web específico para aplicaciones web que hemos equilibrado de carga en numerosos servidores. Para lograr esto, necesito poder establecer el valor del encabezado de host para la solicitud, y he podido lograr esto usando la clase System.Net.WebProxy.Cómo establecer un valor de encabezado de host para solicitudes SSL usando HttpWebRequest

Sin embargo, todo esto se descompone cuando trato de realizar un GET usando SSL. Cuando intento hacer esto, la llamada a HttpWebRequest.GetResponse arroja una System.Net.WebException, con un código de estado HTTP de 400 (Bad Request).

¿Es lo que intento lograr con HttpWebRequest, o debería buscar una forma alternativa de realizar lo que quiero?

Este es el código que he estado utilizando para tratar de conseguir todo esto a trabajar: -

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

Pregunta original: ¿Cómo sabes que necesitas un encabezado de host? "Los encabezados de host HTTP 1.1 no son compatibles cuando usa SSL" http://support.microsoft.com/kb/187504. – russau

+0

Segundo pensamiento: ¿puedes obtener el archivo a través de SSL en un navegador? – russau

+1

Necesito configurar un encabezado de host para poder especificar el servidor exacto al que se debe acceder si la aplicación web está balanceada de carga en varios servidores. Este código es parte de un marco de monitoreo y prueba web que estoy escribiendo. Y sí, las solicitudes de SSL que intento hacer funcionan en el navegador, por lo que el problema se encuentra en algún punto de la forma en que intento implementar una función similar en el código. El artículo que vinculó sugiere que el soporte del encabezado de host para las solicitudes de SSL estuvo disponible en Windows Server 2003 SP1, y todos nuestros servidores deberían estar completamente actualizados. – Cleggy

Respuesta

2

he utilizado un enfoque hacky antes - de tener un exe prueba que modifica mis "anfitriones" archivo, inyectando una entrada para el nombre de la granja a la dirección del servidor específico (y emitiendo un ipconfig /flushdns). Después de eso, las solicitudes deben enrutarse al servidor correcto como si fuera el único allí.

Obviamente, esto requiere acceso de administrador ... Lo uso como parte de una prueba de humo automatizada para golpear la granja como si se tratara de máquinas individuales.

La otra cosa que puede probar es algo en la NLB, tal vez en TCL (en el caso de F5) - tal vez agregar un encabezado personalizado que entiende la NLB? (suponiendo que está haciendo una nueva firma de SSL).

+0

Gracias por la sugerencia, pero eso no funcionará para nosotros. Vamos a ejecutar varios hilos al mismo tiempo, y definitivamente podría haber conflictos de entradas HOSTS en ese escenario. –

0

En .NET 4.0, el encabezado del host se puede establecer independientemente de la URL a la que va dirigida la solicitud, por lo que le recomendaría que utilice HttpwebRequest.Host para resolver su problema. Esto (creo) se enviará como parte de .NET 4.0 beta2. No hay forma de volver a escribir el encabezado del host para que sea diferente en versiones anteriores de .Net sin implementar su propia subclase personalizada de WebRequest (créeme, se ha intentado).

Cuestiones relacionadas