Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向.NET Core注册RabbitMQ使用者?_C#_Rabbitmq - Fatal编程技术网

C# 向.NET Core注册RabbitMQ使用者?

C# 向.NET Core注册RabbitMQ使用者?,c#,rabbitmq,C#,Rabbitmq,我正在尝试使用消息队列(RabbitMQ)在基于微服务的体系结构中处理请求授权 我已经在.NETCore中根据这些配置了一个接收器和发送器作为控制台应用程序。然而,当在现实世界的示例中使用它时,我的应用程序接收项目并不是以使用者的身份收集消息 我假设我必须在Startup.cs中注册消费者,但我似乎无法让它正常工作 我的消费者/响应者代码: public class RabbitMqHandler { private readonly IJWTFactory _jwtFactory;

我正在尝试使用消息队列(RabbitMQ)在基于微服务的体系结构中处理请求授权

我已经在.NETCore中根据这些配置了一个接收器和发送器作为控制台应用程序。然而,当在现实世界的示例中使用它时,我的应用程序接收项目并不是以使用者的身份收集消息

我假设我必须在
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();