Nekromowanie.
Dla tych, którzy wciąż na .NET 2.0
Jest to w rzeczywistości dość łatwe, jeśli wiesz jak.
Problem polega na tym, że nie można ustawić nagłówka hosta, ponieważ struktura nie pozwala na zmianę wartości w czasie wykonywania. (.net framework 4.0+ pozwoli ci przesłonić hosta w httpwebrequest).
Następną próbą będzie ustawienie nagłówka z odbiciem - tak jak zademonstrowano w górnym przegłosowanym odpowiedzi tutaj - w celu obejścia go, co pozwoli ci zmienić wartość nagłówka. Ale przy starcie, to będzie nadpisać ta wartość z części hosta z url, co oznacza odbicie przyniesie ci nic, dlatego ja nie rozumiem, dlaczego ludzie zachować się głosowanie to.
Jeśli nazwa dns nie istnieje, co jest szczerym jedynym przypadkiem, w którym chcesz to zrobić w pierwszej kolejności, nie możesz jej ustawić, ponieważ .NET nie może go rozwiązać, i nie można przesłonić resolwera .NET DNS.
Ale możesz ustawić webproxy z tym samym adresem IP co serwer docelowy.
Dlatego, jeśli IP serwera jest 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
}
}
i voila, teraz
myweb wc = new myweb();
string str = wc.DownloadString("http://redmine.netexistantdomain.com");
i masz odpowiednią stronę z powrotem, jeśli 28.14.88.71 jest serwer WWW z wirtualnym hosting oparty na nazwach (oparty na nagłówku hosta http).
Teraz masz poprawną odpowiedź na oryginalne pytanie, zarówno dla WebRequest, jak i WebClient. Myślę, że używanie niestandardowych gniazd do tego byłoby niewłaściwym podejściem, szczególnie gdy powinno się używać SSL, a gdy rzeczywiste rozwiązanie jest tak proste ...
To pytanie jest bardzo blisko związane z http://stackoverflow.com/ pytania/323264/http-request-bypass-dns-net Może ktoś powinien zamknąć to jako duplikat? –