Согласно заголовку, у меня выполняется долго выполняющийся запрос 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 вместо общего вызова. Помощь