Necromancing.
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 será configurar el encabezado con la reflexión, como se muestra en la respuesta arriba votada aquí, para evitarlo, lo que le permitirá cambiar el valor del encabezado. Pero en tiempo de ejecución, se sobrescribir este valor con la parte de host de la dirección URL , lo que significa que la reflexión le llevará nada, lo cual es por eso que No entender por qué la gente sigue votando hasta esto.
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; // or return request; if you don't neet this
}
}
y listo, ahora
myweb wc = new myweb();
string str = wc.DownloadString("http://redmine.netexistantdomain.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).
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 ...
Esta pregunta está muy relacionada con http://stackoverflow.com/ questions/323264/http-request-bypass-dns-net ¿Tal vez alguien debería cerrarlo como duplicado? –