組み込みデバイスの HTTP デーモンに対して HttpWebRequest を使用すると問題が発生します。問題は、ソケット ストリームに書き込まれる http ヘッダーと http ペイロード (POST) の間に十分な遅延があるため、ソケットがソケット バッファーの内容をサーバーに解放することです。これにより、HTTP 要求が 2 つのパケットに分割されます (フラグメンテーション)。
もちろん、これは完全に有効ですが、パケットが約 1.8 ミリ秒以上分割されている場合、相手側のサーバーはそれに対処できません。したがって、これを(クライアントで)制御する現実的な方法があるかどうか疑問に思っています。
送信に使用されるソケットをこのレベルで制御する HttpWebRequest のプロパティはないようです。また、送信中にのみ作成されるため、ソケット自体に (つまり、リフレクションを介して) アクセスすることはできません。その後リリースされました (アウトバウンド http 接続プーリングの一部として)。BufferWriteStream プロパティは、webrequest 内の本文コンテンツをバッファリングするだけで (したがって、リダイレクトなどに引き続き使用できます)、リクエスト全体がソケットに書き込まれる方法には影響を与えないようです。
じゃあ何をすればいいの?
(ソケットから HTTP クライアントを書き直す必要がないように本当に努めています)
1 つのオプションは、HttpWebRequest が (おそらく ServicePoint を介して) 送信する何らかの種類のプロキシを記述し、その実装で TCP 要求全体をバッファリングすることです。しかし、それは大変な作業のようです。
Fidder を実行しているときも (同じ理由で) 正常に動作しますが、それは実稼働環境では実際にはオプションではありません...
[ps: NoDelay ソケットを使用してフラグメント化を明示的に制御するソケットレベルのテストをノックアップしたため、フラグメント化されたパケット間の間隔が問題であることは間違いありません]