Httpclient получает тайм-аут, прежде чем сервер начнет обрабатывать запрос - PullRequest
0 голосов
/ 07 мая 2018

У меня странная ошибка, которую я не могу воспроизвести на своем компьютере.

Вот полный код, который я использую:

 public async Task LoadHeaderAndFooter()
        {
            //ignore any SSL errors
            ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

            var baseAddress = new Uri(Request.Url.GetComponents(UriComponents.Scheme | UriComponents.Host, UriFormat.Unescaped));
            var cookieContainer = new CookieContainer();
            using (var handler = new HttpClientHandler { CookieContainer = cookieContainer })
            using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
            {
                var oCookies = Request.Cookies;
                for (var j = 0; j < oCookies.Count; j++)
                {
                    var oCookie = oCookies.Get(j);
                    if (oCookie == null) continue;
                    var oC = new Cookie
                    {
                        Domain = baseAddress.Host,
                        Name = oCookie.Name,
                        Path = oCookie.Path,
                        Secure = oCookie.Secure,
                        Value = oCookie.Value
                    };
                    cookieContainer.Add(oC);
                }

                Header.Text = await client.GetStringAsync("/minside/loyalityadmin/header");
                Footer.Text = await client.GetStringAsync("/minside/loyalityadmin/footer");
            }
        }

Что происходит, когда запрос запускается, а затем ожидает тайм-аут (30 секунд по умолчанию), исключение httpclient - это «задача отменена». ТОГДА актуальный запрос срабатывает на сервере.

Теперь этот код запускается в файле .ascx.cs. Заголовок / является MVC-контроллером с представлением .cshtml. Оба работают на одном сервере.

Как мне заставить это работать?

1 Ответ

0 голосов
/ 30 мая 2018

После еще большего тестирования кажется, что у restsharp.org также есть те же проблемы на некоторых платформах (везде, кроме моей платформы разработки).

Оказывается, проблема в объекте сеанса. На IIS невозможно прочитать состояние сеанса в параллель:

Доступ к состоянию сеанса ASP.NET является исключительным для сеанса, что означает что если два разных пользователя делают параллельные запросы, доступ к каждому отдельный сеанс предоставляется одновременно. Тем не менее, если два одновременно запросы делаются для одного и того же сеанса (с использованием того же SessionID значение), первый запрос получает эксклюзивный доступ к сеансу Информация. Второй запрос выполняется только после первого запроса закончен. (Второй сеанс также может получить доступ, если эксклюзивный блокировка информации освобождается, потому что первый запрос превышает время ожидания блокировки.) Если значение EnableSessionState в @ Page директива установлена ​​в ReadOnly, запрос на сеанс только для чтения информация не приводит к исключительной блокировке данных сеанса. Тем не менее, запросы только для чтения для данных сеанса могут все еще ждать для блокировки, установленной запросом на чтение-запись для очистки данных сеанса.

от https://msdn.microsoft.com/en-us/library/ms178581.aspx

Таким образом, решение было просто не передавать идентификатор сессии:

if (oCookie == null || oCookie.Name == "ASP.NET_SessionId") continue;

Ведьма работает нормально, поскольку вторичному запросу не нужен доступ к сеансу. Любое решение, которое позволяет использовать сеанс в обоих запросах, будет получено с благодарностью.

...