C# 向.NET Core注册RabbitMQ使用者?
我正在尝试使用消息队列(RabbitMQ)在基于微服务的体系结构中处理请求授权 我已经在.NETCore中根据这些配置了一个接收器和发送器作为控制台应用程序。然而,当在现实世界的示例中使用它时,我的应用程序接收项目并不是以使用者的身份收集消息 我假设我必须在C# 向.NET Core注册RabbitMQ使用者?,c#,rabbitmq,C#,Rabbitmq,我正在尝试使用消息队列(RabbitMQ)在基于微服务的体系结构中处理请求授权 我已经在.NETCore中根据这些配置了一个接收器和发送器作为控制台应用程序。然而,当在现实世界的示例中使用它时,我的应用程序接收项目并不是以使用者的身份收集消息 我假设我必须在Startup.cs中注册消费者,但我似乎无法让它正常工作 我的消费者/响应者代码: public class RabbitMqHandler { private readonly IJWTFactory _jwtFactory;
Startup.cs
中注册消费者,但我似乎无法让它正常工作
我的消费者/响应者代码:
public class RabbitMqHandler
{
private readonly IJWTFactory _jwtFactory;
public RabbitMqHandler(IJWTFactory jWTFactory)
{
_jwtFactory = jWTFactory;
}
public void Register()
{
var mqFactory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = mqFactory.CreateConnection())
{
Console.WriteLine("Listening on Rabbit MQ");
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "Authorize", durable: false, exclusive: false, autoDelete: false, arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var jwtToken = Encoding.UTF8.GetString(body);
Console.WriteLine("Rceived Message");
var validatedToken = _jwtFactory.ValidateTokenSignature(jwtToken);
SendResponse(validatedToken);
};
channel.BasicConsume(queue: "Authorize", autoAck: true, consumer: consumer);
}
}
}
public void Deregister()
{
}
Startup.cs
注册
.AddSingleton()
编辑:我添加了一些额外的侦听代码,这肯定是在启动时运行的,但RabbitMQ没有将应用程序显示为消费者或频道:
public static class ApplicationBuilderExtentions
{
public static RabbitMqHandler Listener { get; set; }
public static IApplicationBuilder UseRabbitListener(this IApplicationBuilder app)
{
Listener = app.ApplicationServices.GetService<RabbitMqHandler>();
var life = app.ApplicationServices.GetService<IApplicationLifetime>();
life.ApplicationStarted.Register(OnStarted);
//press Ctrl+C to reproduce if your app runs in Kestrel as a console app
life.ApplicationStopping.Register(OnStopping);
return app;
}
private static void OnStarted()
{
Listener.Register();
}
private static void OnStopping()
{
Listener.Deregister();
}
}
公共静态类ApplicationBuilderExtensions
{
公共静态RabbitMqHandler侦听器{get;set;}
公共静态IApplicationBuilder用户AbbitListener(此IApplicationBuilder应用程序)
{
Listener=app.ApplicationServices.GetService();
var life=app.ApplicationServices.GetService();
life.ApplicationStarted.Register(OnStarted);
//按Ctrl+C组合键可复制您的应用程序是否作为控制台应用程序在Kestrel中运行
life.ApplicationStopping.Register(OnStopping);
返回应用程序;
}
私有静态void OnStarted()
{
Listener.Register();
}
私有静态void OnStopping()
{
disregister();
}
}
总结如下:
- 如何正确配置.NET Core中的使用者以使用消息
- 期望消息队列管理请求/响应样式的通信是错误的吗
- 我应该仅仅使用API调用来验证和授权用户吗李>
using
设计用于处理东西,当您到达using
块的末尾时,它调用dispose
。BasicConsume
不是阻塞调用,因此它开始使用并立即返回。
紧接着,通道和连接的
using
块都到达了末尾,处理它们(处理它们与关闭相同)。”
我想补充以下几点:
如果删除using可以很容易地获得所需的结果,则可以快速尝试。更改以下代码行:
using (var connection = mqFactory.CreateConnection())
致:
这会立即奏效。但是请注意,它也会删除正确的处理方法—所以您需要添加—这是一篇来自Microsoft的文章,描述了如何正确地实现IDisposable。那么到底什么不起作用呢<代码>消费者。已接收从未激发?@Evk似乎是这样,在我的服务器中,我也看不到消费者。因此,我甚至不确定
频道.basicConsume
是否正常工作。啊,我看到了问题-您正在关闭频道并在消费开始后立即连接。删除所有using,将连接
和通道
移动到RabbitMqHandler
类的字段,并在取消注册
中关闭它们,而不是在注册
@Evk中尝试现在!只是出于兴趣,在我的代码中我在哪里关闭频道?是因为基本消费
还是因为使用
呢?嗯,使用
是为了处理东西而设计的,当您到达使用块的末尾时,它调用处理
BasicConsume
没有阻止调用,因此它开始使用并立即返回。就在频道
和连接
的使用块结束后,处理它们(处理它们与关闭相同)。@CamiloTerevinto-谢谢你的提示,我已经更新了答案。
var connection = mqFactory.CreateConnection();