Как настроить собственный заголовок узла в HttpWebRequest? Я знаю, что обычно этот класс не позволяет вам это делать, но все равно использовать рефлексию или что-то в этом духе, не нужно ли мне отправлять весь пакет с помощью TCPClient?Как настроить пользовательский заголовок «Host» в HttpWebRequest?
ответ
Существует обходной путь, чтобы сделать это, как описано здесь:
http://blogs.msdn.com/feroze_daud/archive/2005/03/31/404328.aspx
Однако следующая версия базы (.NET Framework 4.0) будет проще.
http://blogs.msdn.com/ncl/archive/2009/07/20/new-ncl-features-in-net-4-0-beta-2.aspx
Надеется, что это помогает.
Я видел эту страницу, хотя в этом обходном пути есть много проблем, потому что это действительно грязный обходной путь :) –
Позор Я не использую .NET 4, который выглядит хорошо. –
вы можете использовать прокси-сервер, см мой ответ на: Request Web Page in c# spoofing the Host
Вы можете использовать этот хак, предназначенный для решения этой проблемы в .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 позволяет это использовать.
var client = new WebClient();
client.Headers.Add("Host", WebHeader);
Я не мог сказать, почему. В документации четко указано, что Host является системным заголовком.
Некронирование.
Для тех, кто еще на .NET 2.0
На самом деле это довольно просто, если вы знаете, как это сделать.
Проблема в том, что вы не можете установить заголовок хоста, потому что фреймворк не позволит вам изменить значение во время выполнения. (.net framework 4.0+ позволит вам переопределить хост в httpwebrequest).
Следующая попытка будет включать заголовок с отражением, чтобы обойти его, что позволит вам изменить значение заголовка. Но во время выполнения он перезапишет это значение хост-частью URL-адреса, что означает, что отражение ничего не принесет вам.
Если имя dns не существует, что, откровенно говоря, является единственным случаем, в котором вы хотите сделать это в первую очередь, вы не можете установить его, потому что .NET не может его решить, и вы не можете переопределить .NET DNS-резольвер.
Но что вы можете сделать, настраивает веб-прокси с тем же IP-адресом, что и целевой сервер.
Таким образом, если ваш IP сервер 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;
}
}
и вуаля, теперь
myweb wc = new myweb();
string str = wc.DownloadString("http://redmine.non-existant-domain.com");
и вы получите нужную страницу назад, если 28.14.88.71 является веб-сервер с виртуальным основанный на имени хостинг (на основе http-host-header).
Nice, для .NET 2.0. Очевидно, что это не сработает, если вам действительно нужно использовать прокси-сервер;) Просто обновите до .NET 4.5 уже - WebRequest и WebClient обе устали в любом случае. – User1
- 1. Добавить пользовательский заголовок в HttpWebRequest
- 2. Как настроить пользовательский HTTP-заголовок в jBoss
- 3. Как настроить пользовательский заголовок с помощью phpmailer
- 4. Как настроить пользовательский заголовок на таймере?
- 5. HttpWebRequest Дата Заголовок
- 6. Как переписать http-заголовок «Host» в HttpURLConnection?
- 7. Как настроить пользовательский заголовок в файле конфигурации curl
- 8. Как настроить пользовательский заголовок ответа в AWS S3
- 9. Как настроить пользовательский заголовок в Google Cloud Endpoints Javascript Client?
- 10. .htaccess - Как настроить пользовательский заголовок в соответствии с переменной environement?
- 11. Как настроить пользовательский заголовок для запросов webView в native-native
- 12. Как настроить пользовательский заголовок в волейбол со строками и Int
- 13. HttpWebRequest создает пользовательский запрос?
- 14. Пользовательский wcf service host factory
- 15. Добавить «Host» к заголовкам, получает сообщение об ошибке (HTTPWebRequest)
- 16. HttpWebRequest заголовок «keep-alive» выпадает
- 17. Как получить заголовок «Host:» из HttpContext (asp.net)
- 18. HttpWebRequest + Exception = Как получить заголовок/тело?
- 19. Как установить HTTPWebRequest заголовок аутентификации с Authenticationresult
- 20. Как настроить пользовательский заголовок с помощью Yahoo Pipes?
- 21. Как настроить пользовательский заголовок xhr с помощью PJAX?
- 22. Delphi Overbyte ICS THttpCli- Как настроить пользовательский заголовок запроса?
- 23. Как настроить пользовательский заголовок для запросов ajax PouchDB?
- 24. Как настроить пользовательский заголовок подсказки на кнопках drawingControlOptions?
- 25. Как настроить заголовок таблицы?
- 26. Перезаписать заголовок HOST в okhttp-запросе
- 27. Как настроить заголовок
- 28. C# настроить HTTPWebrequest Начальная строка
- 29. Как сохранить пользовательский заголовок?
- 30. Как создать пользовательский заголовок?
Что именно вы хотите изменить в заголовке? Поскольку большинство параметров заголовка могут быть косвенно изменены свойствами –
Зачем вам нужно устанавливать заголовок «Host» самостоятельно. Если вы делаете запрос на «www.google.com», он просто становится заголовком хоста. –
@ Yannick Host и другие зарезервированные параметры не могут. –