在Masstransit框架上的Azure队列接收器中获取Api响应

在Masstransit框架上的Azure队列接收器中获取Api响应,azure,queue,azureservicebus,masstransit,azure-servicebus-queues,Azure,Queue,Azureservicebus,Masstransit,Azure Servicebus Queues,我是Masstransit的新手用户,在某一点上我陷入了困境 下面是我的架构 1) 我有一个WebApi控制器,它正在azure队列中使用下面的代码发送消息 if (_dipDecisionSendersEnabled) { //If MassTransit Senders are enabled, send a "ApplicationUpgradeDecision" message to the Message Bus

我是Masstransit的新手用户,在某一点上我陷入了困境

下面是我的架构

1) 我有一个WebApi控制器,它正在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);
            }
        }
if(\u dipDecisionSenders已启用)
{
//如果启用了MassTransit发送器,则向消息总线发送“ApplicationUpgradeDecision”消息
任务下载=SendDipDecisionMessagetoMessageBus(应用程序编号,
systemId.ToString(),
decisionId,外部应用程序参考);
完成=等待下载。配置等待(false);
}
#endregion MassTransit发送器DIPDescisionUpdated
尝试
{
如果(完成)
{
响应=等待更新更新决策(applicationNumber、systemId、decisionId、externalApplicationReference);
}
}
在这里,我所做的是在把消息推到队列中之后,我给第三方打电话更新决定,并得到他们的回复。上述代码位于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);
      }
公共异步任务使用(consumercontext)
{
wait _service.servicething(context.Message.ApplicationNumber).configurewait(true);
wait context.RespondAsync(新的
{
applicationNumber=$“DipDecision-消费者收到了应用程序编号为{context.Message.applicationNumber}的DIP决定”,
systemId=$“DipDecision-消费者收到针对系统的DIP决策:{context.Message.systemId}”,
decisionId=$“DipDecision-消费者收到针对系统的DIP决策:{context.Message.decisionId}”,
externalApplicationReference=$“DipDecision-使用者从外部应用程序引用号:{context.Message.externalApplicationReference}接收到DIP决策”
}).配置等待(true);
}
我希望只有当我在EventController中的响应变量中得到“Ok”作为响应时,才会执行消费者。但是,我无法将webapi响应注入到接收方上下文中


请在此指导或提供我的一些建议。

要在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);
    }
}
公共类请求控制器:
控制器
{
i请求客户(u客户),;
公共请求控制器(IRequestClient客户端)
{
_客户=客户;
}
公共异步任务获取(字符串id)
{
var response=wait_client.GetResponse(新的{OrderId=id});
//根据反应做剩下的事情,好吗
返回视图(response.Message);
}
}
上面链接的文档还显示了如何配置容器


如果您希望有一个单独的控制器方法调用,您可以创建一个响应事件的消费者(您上面概述的消费者随后将发布该事件,而不是调用Respond),该事件将使用HTTP客户端调用您的控制器方法。

这看起来适合我的情况。一旦我完成了它的实现,我将向您进行更新。非常感谢您的投入。你好,Chris,我们是否需要使用强制接口来创建masstransit上的队列?我已经删除了接口,取而代之的是我得到了具有必要属性的类。当我进行此更改时,我的队列创建在azure上运行良好,但RabbitMQ并没有在门户上创建队列,因为它不存在。有什么特别的原因吗?一个类也应该有效,只需要确保它是公开的。RabbitMQ中的管理控制台应为已发布消息创建交换。我建议参考有关消息设计和代理拓扑的文档。克里斯:请检查