Re: Не работает Pipelining на HttpWebRequest'ах
От: Аноним  
Дата: 26.03.14 14:13
Оценка: 10 (2)
ConnectionLimit в 1 поставь.
Не работает Pipelining на HttpWebRequest'ах
От: Sergey J. A. Беларусь  
Дата: 26.03.14 11:32
Оценка:
Изучаю как работает Pipelining с помощью HttpWebRequest. Но что-то никак не могу заставить его работать:

var req1 = (HttpWebRequest)WebRequest.Create("http://vm-2008r2-07:16666/Handler.ashx?first-delay=1s&ticks=10&pattern-size=16&r=1");

Console.WriteLine("SupportsPipelining 1: {0}", req1.ServicePoint.SupportsPipelining);

var resp1 = Task.Factory.FromAsync(
    req1.BeginGetResponse,
    ar => req1.EndGetResponse(ar),
    null
);

// (1) wait for response to be ensure that client known server supports pipelining
resp1.Wait();

var req2 = (HttpWebRequest)WebRequest.Create("http://vm-2008r2-07:16666/Handler.ashx?first-delay=1s&ticks=10&pattern-size=16&r=2");

Console.WriteLine("SupportsPipelining 2: {0}", req2.ServicePoint.SupportsPipelining);

var resp2 = Task.Factory.FromAsync(
    req2.BeginGetResponse,
    ar => req2.EndGetResponse(ar),
    null
);

Task.WaitAll(new Task[] { resp1, resp2 });

Console.WriteLine("Pipelined: {0}, {1}", req1.Pipelined, req2.Pipelined);


Выхлоп:

SupportsPipelining 1: True
SupportsPipelining 2: True
Pipelined: True, True
Press any key to continue . . .


Тем не менее Wireshark показывает 2 TCP сессии. Follow TCP stream показывает каждый запрос по отдельности.

Пробовал коментировать (1), но не помогло.

Ответ сервера (второй такой же):

GET /Handler.ashx?first-delay=1s&ticks=10&pattern-size=16&r=1 HTTP/1.1
Host: vm-2008r2-07:16666
Connection: Keep-Alive

HTTP/1.1 200 OK
Cache-Control: private
Transfer-Encoding: chunked
Content-Type: text/plain; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 26 Mar 2014 11:28:33 GMT

1140EA48935C89878




З.Ы. В действительности мне нужно выключить pipelining, а для этого сначала выяснить в каких случаях он сработает. Поэтому ответы типа "используй xxx" мне не помогут.
Re[2]: Не работает Pipelining на HttpWebRequest'ах
От: Sergey J. A. Беларусь  
Дата: 27.03.14 08:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>ConnectionLimit в 1 поставь.


Спасибо, помогло. Но кроме того, похоже нужно выполнить хоть один полный запрос, что бы .NET понял, что сервер поддерживает pipeline.
В привёдённом примере недостаточно просто подождать ответа от сервера и(не вычитав ответ полностью) попроборвать заслать второй запрос.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.