Получите Api Response в Azure Queue Receiver на платформе Masstransit - PullRequest
0 голосов
/ 16 января 2020

Я новичок в Masstransit и очень сильно застрял в одной точке.

Ниже моя архитектура.

1) У меня есть WebApi COntroller, который отправляет сообщение в azure Очередь с использованием приведенного ниже кода.

        if (_dipDecisionSendersEnabled)
        {
          //If MassTransit Senders are enabled, send a "ApplicationUpgradeDecision" message to the Message Bus

            Task<bool> downloading = SendDipDecisionMessagetoMessageBus(applicationNumber, 
                                                                         systemId.ToString(), 
                                                                        decisionId, externalApplicationReference);
            done = await downloading.ConfigureAwait(false);
        }
        #endregion MassTransit Sender DipDecisionUpdated

        try
        {
            if (done)
            {
                response = await UpdateDIPDecision(applicationNumber, systemId, decisionId, externalApplicationReference).ConfigureAwait(false);
            }
        }

здесь я делаю после отправки сообщения в очередь. Я звоню третьей стороне, чтобы обновить решение и получить от них ответ в ответ. Этот код выше находится в классе EventController.

2) Теперь у меня есть получатель, как показано ниже в другом файле, как DipConsumer.cs, как показано ниже

        public async Task Consume(ConsumeContext<DipDecision> context)
      {
        await _service.ServiceTheThing(context.Message.ApplicationNumber).ConfigureAwait(true);

            await context.RespondAsync<IMassTransit>(new
            {
                applicationNumber = $"DipDecision - Consumer Received DIP Decision for application number : {context.Message.ApplicationNumber}",
                systemId = $"DipDecision - Consumer Received DIP Decision against system : {context.Message.SystemId}",
                decisionId = $"DipDecision - Consumer Received DIP Decision against system : {context.Message.DecisionId}",
                externalApplicationReference = $"DipDecision - Consumer Received DIP Decision from external application reference number : {context.Message.ExternalApplicationReference}"
            }).ConfigureAwait(true);
      }

Я хочу, чтобы мой потребитель выполнялся только тогда, когда я получить "ОК" в качестве ответа в моей переменной ответа, которая находится в EventController. Однако я не могу вставить свой ответ webapi в контекст получателя.

Пожалуйста, ознакомьтесь с некоторыми указаниями здесь.

1 Ответ

1 голос
/ 17 января 2020

Чтобы дождаться ответа в контроллере API, вы можете использовать клиент запросов, как указано в документации .

По сути, ваш контроллер будет ожидать ответа, а затем продолжить обработку.

public class RequestController :
    Controller
{
    IRequestClient<CheckOrderStatus> _client;

    public RequestController(IRequestClient<CheckOrderStatus> client)
    {
        _client = client;
    }

    public async Task<ActionResult> Get(string id)
    {
        var response = await _client.GetResponse<OrderStatusResult>(new {OrderId = id});

        // do the rest of the thing, based upon response.Ok

        return View(response.Message);
    }
}

Приведенная выше документация также показывает, как настроить контейнер.

Если вы вместо этого хотите иметь отдельный вызов метода контроллера, вы можете создать получателя, который отвечает на событие (которое потребитель, которого вы описали выше, затем опубликует sh вместо вызова Respond), которое будет использовать HTTP-клиент для вызова вашего метода контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...