Я управляю ботом службы сообщений, который использует длинные опросы для отправки пользовательских сообщений. Это все работало нормально, пока я не добавил новый компонент, который отправляет простой запрос HTTP get в службу мониторинга сердцебиения каждые 30 секунд. После реализации этого компонента мой бот-код отправляет дополнительный запрос опроса в службу обмена сообщениями каждый раз, когда компонент heartbeat отправляет свой запрос.
Я предполагаю, что запрос, отправленный компонентом heartbeat, прерывает длительный опрос, или что-то в этом роде? Если я закомментирую запрос сердцебиения, все будет нормально.
Я пытался использовать общий HttpClient и отдельные HttpClients, которые утилизируются после любого использования.
Код монитора сердцебиения:
using (var client = new HttpClient())
{
var response = await client.GetAsync(_heartbeatUrl);
var responseString = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
Log.LogMessage(response.ReasonPhrase, LogType.Error);
Log.LogMessage(responseString, LogType.Error);
}
Log.LogMessage(responseString, LogType.Verbose);
}
Код сообщения бот-опроса:
using (var client = new HttpClient())
{
client.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
var jsonData = JsonConvert.SerializeObject(data);
var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
var fullString = _url + "/" + methodName;
Log.LogMessage("Quering: " + fullString, LogType.Verbose);
Log.LogMessage("With Data: " + jsonData, LogType.Verbose);
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, fullString)
{
Content = content,
};
request.Headers.Authorization = new AuthenticationHeaderValue("mybot", _botToken);
var response = await client.SendAsync(request);
var responseString = await response.Content.ReadAsStringAsync();
returnedObject = JsonConvert.DeserializeObject<T>(responseString);
if (!response.IsSuccessStatusCode)
{
Log.LogMessage(response.ReasonPhrase, LogType.Error);
Log.LogMessage(responseString, LogType.Error);
}
Log.LogMessage(responseString, LogType.Verbose);
}
Оба они вызываются в простых циклах while (true), то есть
Thread th = new Thread(async a =>
{
while (true)
{
await SendHeartbeat();
Thread.Sleep(30000);
}
});
и
new Thread(async () =>
{
while (true)
{
try
{
var results = await Methods.getUpdates(_service, update_id);
} catch (Exception e) { Log.LogMessage("Error with HTML query: " + e.Message, LogType.Error, e.StackTrace); }
}
}).Start();
Я немного озадачен тем, что может быть причиной этого. Любые предложения очень ценятся!