【发布时间】: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