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);
}
}
}
}
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
Secondo pensiero: puoi ottenere il file su SSL in un browser? – russau
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