usa tutorial switch quedar puede programar online modificador fuera etiqueta ejecutar control como caso c# http http-headers

tutorial - Solicitar página web en c#falsificando el host



el control no puede quedar fuera del modificador de la etiqueta de caso final (9)

El encabezado "Host" está protegido y no se puede modificar mediante programación. Supongo que para solucionar esto, puedes intentar vincular mediante reflejo la propiedad privada "InnerCollection" del objeto WebRequest y llamar al método "Set" ar "Add" para modificar el encabezado del host. No he intentado esto, pero de una rápida mirada al código fuente en Reflector, creo que es fácil de lograr. Pero sí, el enlace a propiedades privadas de objetos marco no es la mejor manera de lograr cosas. :) Úselo solo si DEBE.

editar: O como el otro chico menciona en la pregunta vinculada, simplemente abre un socket y haz un "GET" rápido manualmente. Debería ser pan comido, si no necesita jugar con otras cosas, como cookies o cualquier otro detalle que HttpWebRequest proporcione.

Necesito crear una solicitud para una página web entregada a nuestros sitios web, pero también debo poder configurar la información del encabezado del host. Lo he intentado usando HttpWebRequest, pero la información del encabezado es de solo lectura (o al menos es parte del host). Necesito hacer esto porque queremos realizar la solicitud inicial de una página antes de que el usuario pueda hacerlo. Tenemos 10 servidores web con equilibrio de carga, por lo que debemos solicitar el archivo desde cada uno de los servidores web.

He probado lo siguiente:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.1.5/filename.htm"); request.Headers.Set("Host", "www.mywebsite.com"); WebResponse response = request.GetResponse();

Obviamente, esto no funciona, ya que no puedo actualizar el encabezado, y no sé si esta es la forma correcta de hacerlo.


Tuve un problema en el que el DNS dns que utilicé tenía varias direcciones IP diferentes. Quería llamar a cada dirección por separado con el mismo nombre DNS en el host; la solución es usar un proxy:

string retVal = ""; // Can''t change the ''Host'' header property because .NET protects it // HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); // request.Headers.Set(HttpRequestHeader.Host, DEPLOYER_HOST); // so we must use a workaround HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Proxy = new WebProxy(ip); using (WebResponse response = request.GetResponse()) { using (TextReader reader = new StreamReader(response.GetResponseStream())) { string line; while ((line = reader.ReadLine()) != null) retVal += line; } } return retVal;

El encabezado del host se establece automáticamente desde ''url'' por .NET, y ''ip'' contiene la dirección real del servidor web al que desea ponerse en contacto (aquí también puede usar un nombre DNS)


Sé que esta es una vieja pregunta, pero en estos días, puedes hacerlo.

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.1.5/filename.htm"); request.Host = "www.mywebstite.com"; WebResponse response = request.GetResponse();


He logrado encontrar una ruta más larga sin aliento mediante el uso de sockets. Encontré la respuesta en la página de MSDN para IPEndPoint:

string getString = "GET /path/mypage.htm HTTP/1.1/r/nHost: www.mysite.mobi/r/nConnection: Close/r/n/r/n"; Encoding ASCII = Encoding.ASCII; Byte[] byteGetString = ASCII.GetBytes(getString); Byte[] receiveByte = new Byte[256]; Socket socket = null; String strPage = null; try { IPEndPoint ip = new IPEndPoint(IPAddress.Parse("10.23.1.93"), 80); socket = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp); socket.Connect(ip); } catch (SocketException ex) { Console.WriteLine("Source:" + ex.Source); Console.WriteLine("Message:" + ex.Message); } socket.Send(byteGetString, byteGetString.Length, 0); Int32 bytes = socket.Receive(receiveByte, receiveByte.Length, 0); strPage = strPage + ASCII.GetString(receiveByte, 0, bytes); while (bytes > 0) { bytes = socket.Receive(receiveByte, receiveByte.Length, 0); strPage = strPage + ASCII.GetString(receiveByte, 0, bytes); } socket.Close();


Sé que esto es viejo, pero me encontré con este mismo problema exacto, y encontré una mejor solución para esto luego usando tomas de corriente o reflexión ...

Lo que hice fue crear una nueva clase que se basa en WebHeaderCollection y omite la validación de lo que se pega dentro de ella:

public class MyHeaderCollection:WebHeaderCollection { public new void Set(string name, string value) { AddWithoutValidate(name, value); } //or public new string this[string name] { get { return base[name]; } set { AddWithoutValidate(name, value); } } }

y así es como lo usas:

var http = WebRequest.Create("http://example.com/"); var headers = new MyHeaderCollection(); http.Headers = headers; //Now you can add/override anything you like without validation: headers.Set("Host", http.RequestUri.Host); //or headers["Host"] = http.RequestUri.Host;

Espero que esto ayude a cualquiera que busque esto!



Aunque esta es una respuesta muy tardía, tal vez alguien puede obtener beneficio de ella

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri("http://192.168.1.1")); request.Headers.GetType().InvokeMember("ChangeInternal", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, request.Headers, new object[] {"Host","www.mysite.com"});

La reflexión es tu amiga :)


Nigromancia
Para aquellos que todavía están en .NET 2.0
De hecho, es bastante fácil, si sabes cómo.

El problema es que no puede configurar el encabezado del host porque el marco no le permitirá cambiar el valor en tiempo de ejecución. (.net framework 4.0+ le permitirá anular el host en una httpwebrequest).

El próximo intento será configurar el encabezado con la reflexión, como se demostró en la respuesta superior alcista aquí, para evitarlo, lo que le permitirá cambiar el valor del encabezado. Pero en tiempo de ejecución, sobrescribirá este valor con la parte del host de la url , lo que significa que la reflexión no te aportará nada, por lo que no entiendo por qué las personas continúan votando esto.

Si el nombre-dns no existe, que es francamente el único caso en el que desea hacer esto en primer lugar, no puede establecerlo, porque .NET no puede resolverlo, y usted no puede anula la resolución .NET DNS.

Pero lo que puede hacer es establecer un webproxy con la misma IP exacta que el servidor de destino.

Entonces, si la IP de su servidor es 28.14.88.71:

public class myweb : System.Net.WebClient { protected override System.Net.WebRequest GetWebRequest(System.Uri address) { System.Net.WebRequest request = (System.Net.WebRequest)base.GetWebRequest(address); //string host = "redmine.nonexistantdomain.com"; //request.Headers.GetType().InvokeMember("ChangeInternal", // System.Reflection.BindingFlags.NonPublic | // System.Reflection.BindingFlags.Instance | // System.Reflection.BindingFlags.InvokeMethod, null, // request.Headers, new object[] { "Host", host } //); //server IP and port request.Proxy = new System.Net.WebProxy("http://28.14.88.71:80"); // .NET 4.0 only System.Net.HttpWebRequest foo = (System.Net.HttpWebRequest)request; //foo.Host = host; // The below reflection-based operation is not necessary, // if the server speaks HTTP 1.1 correctly // and the firewall doesn''t interfere // https://yoursunny.com/t/2009/HttpWebRequest-IP/ System.Reflection.FieldInfo horribleProxyServicePoint = (typeof(System.Net.ServicePoint)) .GetField("m_ProxyServicePoint", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); horribleProxyServicePoint.SetValue(foo.ServicePoint, false); return foo; // or return request; if you don''t neet this } }

y voila, ahora

myweb wc = new myweb(); string str = wc.DownloadString("http://redmine.netexistantdomain.com");

y recupera la página correcta, si 28.14.88.71 es un servidor web con alojamiento virtual basado en nombre (basado en http-host-header).

Ahora tiene la respuesta correcta a la pregunta original, tanto para WebRequest como para WebClient. Creo que usar sockets personalizados para hacer esto sería un enfoque equivocado, particularmente cuando se debe usar SSL, y cuando una solución real es así de simple ...