2012-03-10 1 views
2

Я пишу бота, который должен эмулировать firefox как можно ближе. Анализируя заголовки, которые Он посылает, я нашел одну небольшую разницу, что я не знаю, как избавиться от:Как отправить строчный заголовок Keep-Alive через HttpWebRequest

Firefox использует следующие Keep-Alive заголовок:

Connection: keep-alive 

В то время как C# всегда посылает:

Connection: Keep-Alive 

Я знаю, что это, вероятно, не имеет значения, но я до сих пор люблю, чтобы узнать, есть ли способ/взломать, чтобы изменить этот заголовок, чтобы быть в нижнем регистре.

Любые идеи, как это сделать?

ответ

3

В .NET 4.0 это работает:

request.Headers.GetType().InvokeMember(
    "ChangeInternal", 
    BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, 
    Type.DefaultBinder, 
    request.Headers, 
    new object[] { "Connection", "keep-alive" } 
); 

Просто убедитесь, что вы на самом деле не установить KeepAlive свойство по запросу

+0

Спасибо, что только что сэкономили мой день :) – MeeKaaH

0

Мне также нужно сделать это с помощью C# и пытались с помощью HttpWebRequest. Не .NET SOAP-веб-сервис, который я хочу назвать ожидающим. Соединение: keep-alive в нижнем регистре тоже.

Я бы предпочел не идти по пути программирования сокетов для этого, поэтому, если у вас есть какие-либо предложения о том, как вы работали вокруг этого, если бы вы это сделали, это было бы очень полезно.

Мое исследование до сих пор:

При использовании протокола HTTP версии 1.1, заголовок даже не послал, даже если указать свойство.

например.

var request = (HttpWebRequest)WebRequest.Create(Endpoint); 
request.KeepAlive = true; 

Решение этой проблемы заключается в использовании System.Reflection изменить httpBehaviour, который будет означать Keep-Alive отправляется. Это отправит начальный регистр верхнего регистра K и A «Keep-Alive» по каждому запросу.

var sp = request.ServicePoint; 
var prop = sp.GetType().GetProperty("HttpBehaviour", BindingFlags.Instance | BindingFlags.NonPublic); 
prop.SetValue(sp, (byte)0, null); 

Я попытался с помощью System.Reflection изменить заголовок тоже. Ниже код добавит флаг правильно в нижнем регистре:

request.Headers.GetType().InvokeMember("ChangeInternal", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, Type.DefaultBinder, request.Headers, new object[] { "Connection", "keep-alive" }); 

Однако в момент, когда я называю GetResponse

вар ответ = (HttpWebResponse) request.GetResponse()

заголовок уничтожается. Рассматривая исходный код для HttpWebRequest.cs, это происходит прямо перед отправкой заголовков в провод.

// 
    // The method is called right before sending headers to the wire* 
    // The result is updated internal _WriteBuffer 
    // 
    // See ClearRequestForResubmit() for the matching cleanup code path. 
    // 
    internal void SerializeHeaders() { 

    .... 
    .... 

     string connectionString = HttpKnownHeaderNames.Connection; 
     if (UsesProxySemantics || IsTunnelRequest) { 
      _HttpRequestHeaders.RemoveInternal(HttpKnownHeaderNames.Connection); 
      connectionString = HttpKnownHeaderNames.ProxyConnection; 
      if (!ValidationHelper.IsBlankString(Connection)) { 
       _HttpRequestHeaders.AddInternal(HttpKnownHeaderNames.ProxyConnection, _HttpRequestHeaders[HttpKnownHeaderNames.Connection]); 
      } 
     } 
     else { 
      _HttpRequestHeaders.RemoveInternal(HttpKnownHeaderNames.ProxyConnection); 
     } 

RemoveInternal также удалит заголовок, который мы взломали, используя Reflection.

Так что это все еще оставляет меня застрявшим.

Есть ли какой-либо другой способ, кроме перехода на уровень сокета? Существуют ли другие классы или сторонние библиотеки, которые позволяют мне изменять заголовки по своему желанию?

Жаль, что это не ответ, но я пока не можем комментировать ваш вопрос.

+0

Я в конце концов отказался от этого. Это просто невозможно сделать в C#. Я поговорил с разработчиками службы, к которой я пытался подключиться, и угадал, что - они установили BUG на их стороне –

1

Connection: keep-alive по умолчанию заголовок Chrome и Firefox браузер.

Connection: Keep-Alive является заголовком по умолчанию Internet Explorer. Абсолютно

Connection: Keep-Alive является заголовком по умолчанию HttpWebRequest. Я думаю, что вам нужно написать бот, как IE - лучший выбор, если вы используете HttpWebRequest.

+0

Спасибо! Я решил проблему с некоторым проблемным сервером, просто изменив useragent на Internet Explorer. – imlokesh

Смежные вопросы