Я использую Общественный транспорт
Следующий код возвращает значение 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-сообщение)
Есть ли способ преодолеть эту проблему?
Вы не можете использовать 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);
}