OData в микросервисном API-шлюзе - PullRequest
0 голосов
/ 28 января 2020

Возможно ли в рамках микросервисной архитектуры, использующей MassTransit, использовать OData на уровне базы данных?

У меня есть шлюз REST API на моем уровне микросервисов. Я добавил OData к контроллеру в API, фильтрация применяется, но она запускается на уровне API после того, как все записи были выбраны из базы данных, а затем возвращены микросервисом в API. Можно ли передать параметры запроса odata до уровня микросервиса, который будет применяться на уровне базы данных?

Я пробовал следующее, но у меня возникают проблемы с сериализацией при попытке передать ODataQueryOptions.

Это действие на контроллере

public async Task<IActionResult> Get(ODataQueryOptions<Domain.Models.Course> options)
{
  var obj = new
  {
      CorrelationId = Guid.NewGuid(),
      UserId = userId,
      Options = options
   };

   var response = await _getCoursesClient.GetResponse<IGetCoursesResult>(obj);
}

Потребитель

public IQueryable<Entities.Course> GetCourses()
{
   return _context.Courses.AsNoTracking().AsQueryable();
}

public async Task Consume(ConsumeContext<IGetCourses> context)
{
   try
   {
      IQueryable<Domain.Models.Course> courses;
      courses = _mapper.Map<IQueryable<Domain.Models.Course>>context.Message.Options.ApplyTo(_repository.GetCourses()));

      await context.RespondAsync<IGetCoursesResult>(new
      {
          Courses = courses,
          context.CorrelationId,
          Success = true
      });

   }
   catch (Exception ex)
   {
       await _logger.Log(context, context.Message.CorrelationId, ex.Message, GetType(), LogLevel.Error);
       throw;
   }
}

Произошла ошибка

MassTransit.RequestException: An exception occurred while processing the IGetCourses request
 ---> System.Runtime.Serialization.SerializationException: Failed to serialize message
 ---> System.IO.IOException: Stream was too long.
   at System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
   at System.IO.StreamWriter.Write(Char[] buffer, Int32 index, Int32 count)```
...