У меня проблема с использованием HttpWebRequest против HTTP-демона на встроенном устройстве. Кажется, проблема в том, что между записью заголовков http в поток сокета и полезной нагрузкой http (POST) достаточно задержки, чтобы сокет высвобождал содержимое буфера сокета на сервер. Это приводит к тому, что HTTP-запрос разделяется на два пакета (фрагментация).
Это, конечно, совершенно верно, однако сервер на другом конце не справится с этим, если пакеты разделены более чем на 1,8 мс. Поэтому мне интересно, есть ли какие-либо реалистичные способы управления этим (на клиенте).
Похоже, что в HttpWebRequest отсутствуют какие-либо свойства, обеспечивающие этот уровень контроля над сокетом, используемым для отправки, и невозможно получить доступ к самому сокету (то есть с помощью отражения), поскольку он создается только во время отправить, а затем освободить (как часть пула исходящих http-соединений). Свойство BufferWriteStream просто буферизует содержимое тела в веб-запросе (таким образом, оно все еще доступно для перенаправлений и т. Д.) И, по-видимому, не влияет на способ записи всего запроса в сокет.
Так что же делать?
(я действительно стараюсь не переписывать HTTP-клиент из сокета вверх)
Одним из вариантов может быть написание какого-то прокси-сервера, которому HttpWebRequest отправляет (возможно, через ServicePoint), и в этой реализации буферизует весь TCP-запрос. Но это похоже на тяжелую работу.
Он также отлично работает, когда я запускаю Fidder (по той же причине), но это не совсем вариант в нашей производственной среде ...
[ps: я знаю, что именно интервал между фрагментированными пакетами является проблемой, потому что я запустил тест на уровне сокетов, где я явно управлял фрагментацией, используя сокет NoDelay]