¿Cómo puedo configurar un encabezado de host personalizado en HttpWebRequest? Sé que normalmente esta clase no te permite hacerlo, pero ¿hay alguna forma de utilizar el reflejo o algo así sin que realmente necesite que envíe todo el paquete con TCPClient?¿Cómo establecer el encabezado "Host" personalizado en HttpWebRequest?
Respuesta
Hay una manera indirecta de hacer esto, como se describe aquí:
http://blogs.msdn.com/feroze_daud/archive/2005/03/31/404328.aspx
Sin embargo, la próxima versión del marco (.NET Framework 4.0) hará que sea más fácil.
http://blogs.msdn.com/ncl/archive/2009/07/20/new-ncl-features-in-net-4-0-beta-2.aspx
Espero que esto ayude.
He visto esa página aunque hay muchos problemas en esa solución además de que es una solución muy sucia :) –
Lástima que no utilizo .NET 4 que se ve bien. –
puede utilizar proxy, consulte mi respuesta en: Request Web Page in c# spoofing the Host
Puede utilizar este truco, diseñado para resolver este problema en .Net 3.5.
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Reflection;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://198.252.206.16");
FieldInfo headersFieldInfo = request.GetType().GetField("_HttpRequestHeaders", System.Reflection.BindingFlags.NonPublic
| System.Reflection.BindingFlags.Instance
| System.Reflection.BindingFlags.GetField);
CusteredHeaderCollection WssHeaders = new CusteredHeaderCollection("stackoverflow.com");
headersFieldInfo.SetValue(request, WssHeaders);
request.Proxy = null;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string result = sr.ReadToEnd();
Console.WriteLine(result);
Console.ReadLine();
}
public class CusteredHeaderCollection : WebHeaderCollection
{
public bool HostHeaderValueReplaced { get;private set; }
public string ClusterUrl { get; private set; }
public CusteredHeaderCollection(string commonClusterUrl) : base()
{
if (string.IsNullOrEmpty("commonClusterUrl"))
throw new ArgumentNullException("commonClusterUrl");
this.ClusterUrl = commonClusterUrl;
}
public override string ToString()
{
this["Host"] = this.ClusterUrl;
string tmp = base.ToString();
this.HostHeaderValueReplaced = true;
return tmp;
}
}
}
}
WebClient lo lo permite.
var client = new WebClient();
client.Headers.Add("Host", WebHeader);
No podría decirte por qué. La documentación establece claramente que Host es un encabezado del sistema.
Nigromanciación.
Para aquellos que todavía están en .NET 2.0
De hecho, es bastante fácil, si sabes cómo hacerlo.
El problema es que no puede establecer el encabezado de 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 siguiente intento establecerá el encabezado con reflexión, 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 le aportará nada.
Si el nombre-dns no existe, lo que es francamente el único caso en el que desea hacer esto en primer lugar, no puede establecerlo, porque .NET no puede resolverlo, y no puede anular la resolución de DNS de .NET.
Pero lo que puede hacer es configurar un servidor web con la misma IP exacta que el servidor de destino.
tanto, si su IP del 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;
return request;
}
}
y listo, ahora
myweb wc = new myweb();
string str = wc.DownloadString("http://redmine.non-existant-domain.com");
y se obtiene la página correcta hacia atrás, si 28.14.88.71 es un servidor web con Virtual hosting basado en nombre (basado en http-host-header).
Bueno, para .NET 2.0. Obviamente, esto no funcionará si realmente necesita usar un servidor proxy;) Simplemente actualice a .NET 4.5 ya - WebRequest y WebClient están ambos obsoletos. – User1
- 1. Agregar encabezado personalizado en HttpWebRequest
- 2. Cómo establecer un valor de encabezado de host para solicitudes SSL usando HttpWebRequest
- 3. Establecer encabezado SOAP personalizado utilizando Axis 1.4
- 4. HttpWebRequest Formato de encabezado de fecha
- 5. ¿Cómo configuro el HttpRequestHeader para una HttpWebRequest?
- 6. jQuery AJAX Encabezado personalizado
- 7. Cómo obtener el encabezado "Host:" desde HttpContext (asp.net)
- 8. Establecer el encabezado del Referer en asp.net
- 9. ¿Cómo establecer un campo de encabezado en POST un formulario?
- 10. Cómo establecer el encabezado de tipo de contenido de WebClient?
- 11. Cómo establecer dinámicamente el valor del encabezado en JSP
- 12. ¿Cómo establecer un color personalizado en itext?
- 13. Ruta de raíles basada en el host virtual (encabezado HTTP del host)
- 14. ¿Cómo agregar un encabezado a HttpWebRequest en la aplicación de Windows 8?
- 15. ¿Por qué HttpContext no contendría un encabezado "Host"?
- 16. Cómo establecer cadenas de encabezado de solicitud
- 17. SoapClient set encabezado HTTP personalizado
- 18. Establecer el encabezado de envío de formulario
- 19. ¿Cuándo podría el encabezado del host HTTP ser indefinido?
- 20. Java - DefaultHttpClient y el encabezado "Host" [Apache HttpComponent]
- 21. wp7 pivotcontrol establecer encabezado nulo
- 22. Encabezado de autorización HTTP personalizado
- 23. Problema de Axis2 al establecer el encabezado HTTP de SOAPAction
- 24. encabezado personalizado se superpone a las celdas en el grupo
- 25. Solicitar página web en C# spoofing the Host
- 26. Actualización de encabezado de host en IIS con Powershell
- 27. Cambiar cuadro de diálogo personalizado 'encabezado' al 'encabezado' AlertDialog
- 28. nginx - leer el encabezado personalizado desde el servidor ascendente
- 29. ¿Cómo establecer un ícono personalizado para el archivo dll?
- 30. Establecer un encabezado de solicitud en JavaScript
¿Qué es exactamente lo que quiere cambiar en el encabezado? Debido a que la mayoría de los parámetros del encabezado pueden ser modificados indirectamente por las propiedades –
¿Por qué necesita configurar el encabezado "Host" usted mismo? Si realiza una solicitud a 'www.google.com', simplemente se convierte en encabezado de host. –
@Yannick Host y otros parámetros reservados no pueden. –