Задать вопрос
@Razer1511

Как исправить исключение при отправке запроса?

Добрый день. Уже 2 дня не могу решить данную проблему

У меня есть 2 сервиса, которые контактируют между собой CoreService и MidService.
Принцип работы: MidService делает некую работу с данными и отправляет результаты на CoreService httpPost запросами.

Моя задача: сделать буфер сообщений для тех случаев, когда CoreService отключен. После того, как CoreService будет онлайн и два сервиса вновь соединятся друг с другом, я должен буду из этого буфера всё отправить на CoreService.

Моя реализация: Я создал очередь HttpRequestMessage

public Queue<HttpRequestMessage> HttpRequestMessagesQueue = new Queue<HttpRequestMessage>();


Теперь, если сообщение из MidService не отправилось в CoreService, то оно начинает будет храниться в очереди.

После того, как сервисы вновь соединяются, начинается проверка очереди:

void ProcessCoreMessage(string jsonStr)
        {
            try
            {
                if(HttpServer.HttpRequestMessagesQueue.Count != 0)
                {
                    HttpServer.CheckQueue();
                }


public async Task<HttpResponseMessage> CheckQueue()
        {
            HttpResponseMessage response = null;
            try
            {
                var request = HttpRequestMessagesQueue.Peek();
                HttpClient httpClient = new HttpClient();

                response = await httpClient.SendAsync(request);
            }
            catch(Exception ex)
            {
                _logger.Debug($"{DateTime.Now.ToLongTimeString()} ||||| {ex.InnerException}");
            }
            return response;
        }


Возникает исключение:

25.12 14:54 | DEBUG | 14:54:12 ||||| System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'System.Net.Http.StringContent'.
at System.Net.Http.HttpContent.CheckDisposed()
at System.Net.Http.HttpContent.CopyToAsync(Stream stream, TransportContext context, CancellationToken cancellationToken)
at System.Net.Http.HttpConnection.SendRequestContentAsync(HttpRequestMessage request, HttpContentWriteStream stream, Boolean async, CancellationToken cancellationToken)
at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)


P.S. Тут показан пример для одного элемента очереди. Я понимаю, что нужно проходиться циклом foreach по всей очереди и тд. Прошу вашей помощи
  • Вопрос задан
  • 224 просмотра
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@EgorSvinarev
Наверное, самым удачным решением в данном случае будет добавление прослойки между сервисами в виде брокера сообщений в виде RabbitMQ. Он позволит вам обрабатывать запросы после включения сервиса обработчика. Почитайте про модель PubSub в контексте этого брокера, она как раз по
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Я тоже голосую за MQ сервисы. Тут само задание тяготеет к такому подходу. Но автор работает на MS-технологиях и ему наверное органичнее будет брать какое-то решение от МС. Вот облачное https://learn.microsoft.com/en-us/azure/service-bu...

И еще можно посмотреть Microsoft Message Queuing (MSMQ) но жив ли этот проект сейчас я не знаю. Надо смотреть.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы