Начало нового быстрого http-запроса, пока выполняется длительный - PullRequest
0 голосов
/ 01 ноября 2019

Согласно заголовку, у меня выполняется долго выполняющийся запрос GET, и мне нужно выполнить небольшие быстрые запросы в ожидании ответа на длинный запрос. К сожалению, быстрые запросы, похоже, должны ждать выполнения долго выполняющегося, прежде чем им разрешат исполняться. Если это помогает визуализировать, то это веб-служба, принимающая запросы, которые она передает другому веб-сервису, и возвращающая результаты обратно своему клиенту, чтобы они могли приходить в значительной степени, однако и всякий раз, когда клиент запускает их.

Я пытался использовать один и тот же httpclient, разные httpclient, я пытался изменить HttpClientHandler.MaxConnectionsPerServer и ServicePointManager.DefaultConnectionLimit, и, кажется, ничего не делает. Я видел решения, использующие WhenAll и т. Д., Но здесь это не работает, потому что небольшие запросы приходят после того, как долго запущенный запрос уже давно запущен и когда «WhenAll-ed».

Я создал тестовое приложениеэто простая форма Windows для устранения этой проблемы, она выглядит примерно так (с нажатиями кнопок для имитации получения веб-запросов):

    CookieContainer CookieContainer = null;
    MyClient myClient;

    public Form1()
    {
        InitializeComponent();
        ServicePointManager.DefaultConnectionLimit = 10;

        myClient = new MyClient(ref CookieContainer);
    }

    private async void button1_Click(object sender, EventArgs e)
    {            
        bool success = await myClient.GetStockItemTables();
        this.label1.Text = success.ToString();
    }

    private async void button2_Click(object sender, EventArgs e)
    {            
        bool success = await myClient.GetGiftCardBalance();
        this.label2.Text = success.ToString();
    }


class MyClient
{
    string EndpointURL = @"XXX";
    private HttpClient Client;
    private HttpClientHandler ClientHandler;       

    public MyClient(ref CookieContainer cookieContainer)
    {
        try
        {
            bool loginRequired = false;                

            if (cookieContainer == null)
            {
                loginRequired = true;
                cookieContainer = new CookieContainer();
                //clientHandler = new HttpClientHandler { UseCookies = true, CookieContainer = new CookieContainer() };
            }

            ClientHandler = new HttpClientHandler { UseCookies = true, CookieContainer = cookieContainer, MaxConnectionsPerServer = 10 };

            Client = new HttpClient(ClientHandler)
            {
                BaseAddress = new Uri(EndpointURL),
                DefaultRequestHeaders =
                {
                    Accept = {MediaTypeWithQualityHeaderValue.Parse("text/json")}
                },
                Timeout = TimeSpan.FromHours(1)
            };

            if (loginRequired)               
                DoLogin(false);                
        }
        catch (Exception ex)
        {

        }
    }
    public async Task<bool> LongRunningRequest()
    {

        try
        {                
            var result = await Client.GetAsync(EndpointURL + "YYY");

            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }
    public async Task<bool> QuickRequest()
    {

        try
        {                
            var result = await Client.GetAsync(EndpointURL + "ZZZ");

            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }
}

CookieContainer передается / выводится для поддержки информации для входа и входаметод исключен, потому что он работает, и он не имеет отношения к проблеме. В результате нажатия кнопки 1, а затем кнопки 2 код застревает на быстрых запросах PostAsync до тех пор, пока длинные запросы GetAsync не будут завершены. Те же результаты, если каждый вызов использует свой собственный MyClient вместо общего вызова. Помощь

1 Ответ

0 голосов
/ 01 ноября 2019

Похоже, это был не я или код. Веб-сервис, который я использую, блокировал параллельные запросы из одного сеанса. Изменение быстрого запроса на «получение» от Google оценивает сразу и не блокируется, как ожидалось. Похоже, решение состоит в том, чтобы создать второй сеанс для этих быстрых вызовов, чтобы они не блокировались, если мы находимся в середине длинного запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...