C# httpclient post force одиночный пакет

Используя Microsoft Message Analyzer, я вижу, что данные публикации с использованием HttpClient отправляются двумя пакетами tcp. Один для заголовка, затем один для данных публикации. Эти данные могут легко поместиться в один пакет, однако он разбивается на два. Я явно включил ворчание и ожидаю, что 100 продолжат отключение с помощью ServicePointManager, хотя, похоже, это не помогает.

        ServicePointManager.Expect100Continue = false;
        ServicePointManager.UseNagleAlgorithm = true;

C# httpclient post force одиночный пакет 5023 (.Net) показывает, что 2 пакета отправлены по назначению, 8170 (Почтальон) показывает, что отправляется 1 пакет. Тесты проводились с той же полезной нагрузкой.

Ниже приведен пример кода, используемого для генерации запроса в .net.

    public void TestRequest()
    {
        var uri = new Uri("http://www.webscantest.com/");
        ServicePointManager.Expect100Continue = false;
        ServicePointManager.UseNagleAlgorithm = true;
        var p = ServicePointManager.FindServicePoint(uri);
        p.Expect100Continue = false;
        p.UseNagleAlgorithm = true;
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Add("Connection", "close");

        var values = new Dictionary<string, string>
        {
            { "thing1", "hello" },
            { "thing2", "world" }
        };

        var content = new FormUrlEncodedContent(values);

        var response = client.PostAsync("http://www.webscantest.com/", content, CancellationToken.None).Result;
    }

Есть ли способ объединить полезную нагрузку в один пакет?

Использование .Net Framework 4.7

связанный вопрос здесь

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

BugFinder 09.04.2018 10:00

Nagle может только уменьшать количество отправляемых пакетов, поэтому его отключение не поможет.

C.Evenhuis 09.04.2018 10:14

А почему именно для вас это проблема?

Evk 09.04.2018 10:14

спасибо @BugFinder, но у меня недостаточно репутации, чтобы опубликовать комментарий в основной теме этого сообщения, спрашивая, нашел ли OP когда-нибудь решение ...

Calvin Pietersen 10.04.2018 01:36

@ C.Evenhuis - Я тестировал с выключенным Expect 100 Continue и включенным Nagle, и проблема все еще та же.

Calvin Pietersen 10.04.2018 01:36

@Evk - Мы пытаемся сильно оптимизировать HTTP-запросы на очень загруженных серверах.

Calvin Pietersen 10.04.2018 01:42

@CalvinPietersen Nagle не решает вашу проблему, но единственное, что он может сделать, - это объединить пакеты. Это происходит только в том случае, если он не получил ACK на ранее отправленный пакет.

C.Evenhuis 10.04.2018 08:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
7
1 047
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поэтому, посмотрев на исходный код ядра dotnet (могу только предположить то же самое в других версиях .net), я вижу в WinHttpHandler, что Заголовок запроса и Тело запроса отправляются в разных точках.

Заголовок запроса отправляется с Interop.WinHttp.WinHttpSendRequest. Затем тело запроса с Interop.WinHttp.WinHttpWriteData, которое, согласно документам WinHttp, будет «Дождитесь завершения WinHttpSendRequest перед вызовом этой функции».

Я думаю, что эту проблему можно было бы решить, если бы тело запроса было отправлено с помощью WinHttpSendRequest, который в настоящее время устанавливает тело как IntPtr.Zero.

Заголовок запроса здесь

Тело запроса здесь

Интересные находки Кальвина!

Hun1Ahpu 12.04.2018 08:13

Другие вопросы по теме