【问题标题】:Using RabbitMQ in ASP.NET Core MVC在 ASP.NET Core MVC 中使用 RabbitMQ
【发布时间】:2021-04-18 04:05:41
【问题描述】:

我正在使用 RabbitMQ 编写一个 ASP.NET Core MVC 应用程序。我能够成功实现发布/订阅模式。但是,我在应用程序上显示订阅消息时遇到了问题。

HomeController上的连接方法:

    [HttpPost]
    public IActionResult Index(string serverName, string userName, string password, string port)
    {
        RabbitMq rabbitMq = new RabbitMq();
        var pubConnection = rabbitMq.CreateConnection(serverName, userName, password, port);

        if (!pubConnection.IsOpen)
        {
            ViewBag.NotConnected = "Not Connected. Try Again.";
            return View();
        }

        var subConnection = rabbitMq.CreateConnection(serverName, userName, password, port);

        MyClient myClient = new MyClient();
        myClient.CreatePublisher(pubConnection);
        myClient.CreateSubscriber(subConnection);

        return RedirectToAction(actionName: "Index", controllerName: "MyClientXYZ", routeValues: null);
    }

MyClient 类的订阅者方法:

public void CreateSubscriber(IConnection pubSubConnection)
{
        var channel = pubSubConnection.CreateModel();

        channel.ExchangeDeclare("MyExchange", ExchangeType.Fanout, durable: true, true);
        channel.ExchangeBind("MyExchange", "ClientExchange", "#", null);
        var slotQueueName = channel.QueueDeclare("my queue", true, autoDelete: true).QueueName;
        channel.QueueBind(slotQueueName, "MyExchange", routingKey: "");

        var consumer = new EventingBasicConsumer(channel);

        consumer.Received += (model, ea) =>
        {
            var body = ea.Body.ToArray();
            var message = Encoding.UTF8.GetString(body);
            Console.WriteLine(" [x] {0}", message);
        };

        channel.BasicConsume(queue: slotQueueName,
            autoAck: true,
            consumer: consumer);
}

我可以在控制台上打印订阅者消息。但我需要在 UI 上显示此消息(视图、任何 JS 弹出窗口等)我尝试了很多方法,例如将订阅消息设置为 TempData["subMessage"]、redirectToAction()、打开 JS 弹出窗口以显示订阅者消息。但是,我做不到。

我只想在回调方法执行时在 UI 上显示订阅者消息。

【问题讨论】:

  • 我不太明白你的思维过程。您在控制器操作中创建一个 RMQ 连接,返回一个结果,该连接被处理掉.. 是什么提供了与客户端的持久连接以推送更新?或者这是一个投票解决方案?感觉就像您应该将您的 rmq 作为在其他地方持续运行的东西(不是由控制器操作启动),在消息发布时将消息推送到您的 javascript 客户端连接到的 SignalR 集线器中,这将在可用于更新 ui 的客户端。
  • 还有创建多个连接的必要理由吗?就像@Caius 所说,您通常会在应用程序的整个生命周期中创建一个连接,并使用它来创建您需要的任何订阅者/发布者频道
  • 甚至可以让 javascript 客户端直接订阅 RMQ(我从未看过/尝试过),在这种情况下,可以将大量工作交给客户端RMQ并将服务器排除在外;任何你想要在客户端上的东西只要把它推到队列中
  • 是的,我需要有两个连接。实际上,我正在创建一个测试应用来测试另一个应用。
  • 我们为此使用了 signalR。当事件发生时,它会在客户端调用 signalR 事件并更新数据。可能会有所帮助。

标签: c# asp.net asp.net-mvc asp.net-core rabbitmq


【解决方案1】:

这是不对的。 RabbitMQ 连接和消费者是长期存在的实体;不是您在控制器操作中启动的短暂事件。

简短的回答是在 RabbitMQ 之上使用框架。这里有两个值得考虑的好方法:

长答案是推出您自己的 RabbitMQ 基础架构。如果您是专家并且有特殊需要,您可以这样做。在这种情况下,也许从这里开始:

另一个答案是完全重新评估你想要达到的目标。

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多