Если использовать HttpWebRequest для небольших POST запросов, то после отправки заголовка запрос ждет некоторое время, около 200мс и отсылает данные запроса. При больших запросах данные отправляются сразу без задержки. Это похоже на описание свойства NoDelay для сокета
The Nagle algorithm reduces network traffic by causing the socket to buffer packets for up to 200 milliseconds and then combines and sends them in one packet
Каким образом можно побороть такую функциональность? А то получается маленькие запросы выполняюься 200+мс, а большие за несколько
HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create("http://");
webRequest.Method = "POST";
webRequest.ProtocolVersion = HttpVersion.Version10;
byte[] bytes = Encoding.UTF8.GetBytes(body);
webRequest.ContentLength = bytes.Length;
using (Stream requestStream = webRequest.GetRequestStream())
{
requestStream.Write(bytes, 0, bytes.Length);
}
HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse();
Здравствуйте, o.kostya, Вы писали:
OK>OK>The Nagle algorithm reduces network traffic by causing the socket to buffer packets for up to 200 milliseconds and then combines and sends them in one packet
IMHO, Этот веб запрос работает через тот же самый объект что и Internet Explorer, врятли есть возможность чтолибо там переделать.. для этого нужно переписать HTTP клиента на уровне сокетов.
Вебклиент использует класс System.Net.Connection как абстракцию сетевого соединения — в этом классе в фукнкции StartConnectionCallback есть такое
if (!this.m_Server.UseNagleAlgorithm)
{
socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.Debug, 1);
}
Где — m_Server объект типа ServicePoint, у которого в конструкторе происходит инициализация:
this.m_UseNagleAlgorithm = ServicePointManager.UseNagleAlgorithm;
А ServicePointManager.UseNagleAlgorithm — вот он:
public static bool UseNagleAlgorithm
{
set
{
GetConfig();
s_NetConfig.useNagleAlgorithm = value;
}
}
И GetConfig:
s_NetConfig = (NetConfiguration) ConfigurationSettings.GetConfig("system.net/settings");
Короче говоря, делаете ServicePointManager.UseNagleAlgorithm = false, или можете экспериментировать с недокументированными секциями конфига (
http://support.microsoft.com/kb/810814).