MassTransit RespondAsync не может вернуть нулевое значение

Я использую Общественный транспорт

Следующий код возвращает значение null, а Context.RespondAsync не может вернуть значение null

Когда город не найден, я хочу вернуть null, а в контроллере я проверяю, является ли ответ нулевым, а затем возвращаю Not Found

Контроллер:

 var request = _mediator.CreateRequestClient<TGetQuery>();

 GetCityQuery getQuery = _mapper.Map<GetCityQuery>(id);

 var result = await request.GetResponse<CityViewModel>(getQuery, cancellationToken);
 if (result.Message == null)
 {
      return NotFound();
 }
 return Ok(result.Message);

И Потребитель:

public async Task Consume(ConsumeContext<GetCityQuery> context)
    {
        var cancellationToken = context.CancellationToken;
        var request = context.Message;
        var entity = await _cityRepository.TableNoTracking
            .ProjectTo<CityViewModel>(_mapper.ConfigurationProvider)
            .SingleOrDefaultAsync(x => x.Id == request.Id, cancellationToken);

        await context.RespondAsync(entity);
    }

Итак, остановка общественного транспорта System.ArgumentNullException: значение не может быть нулевым. (Параметр «сообщение») в MassTransit.Context.BaseConsumeContext.RespondAsync[T](T-сообщение)

Есть ли способ преодолеть эту проблему?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
2
0
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете использовать null в качестве сообщения. Если вы хотите использовать несколько типов ответов для клиента запроса, вы можете указать типы отдельно:

var request = _mediator.CreateRequestClient<TGetQuery>();

 GetCityQuery getQuery = _mapper.Map<GetCityQuery>(id);

 var result = await request.GetResponse<CityViewModel, NotFound>(getQuery, cancellationToken);
 if (result.Is(out Response<CityViewModel> response)
 {
     return Ok(response.Message);
 }

return NotFound();

Вам нужно будет определить тип сообщения:

public class NotFound
{
}

Затем в вашем потребителе:

public async Task Consume(ConsumeContext<GetCityQuery> context)
{
     var request = context.Message;
     var entity = await _cityRepository.TableNoTracking
          .ProjectTo<CityViewModel>(_mapper.ConfigurationProvider)
          .SingleOrDefaultAsync(x => x.Id == request.Id, context.CancellationToken);
     if(entity == null)
          await context.RespondAsync(new NotFound());
     else
          await context.RespondAsync(entity);
}

Другие вопросы по теме