Мне также нужно сделать это с помощью 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.
Так что это все еще оставляет меня застрявшим.
Есть ли какой-либо другой способ, кроме перехода на уровень сокета? Существуют ли другие классы или сторонние библиотеки, которые позволяют мне изменять заголовки по своему желанию?
Жаль, что это не ответ, но я пока не можем комментировать ваш вопрос.
Спасибо, что только что сэкономили мой день :) – MeeKaaH