当前位置: 首页 > 知识库问答 >
问题:

用。NET核心注册RabbitMQ使用者?

贾建茗
2023-03-14

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

根据这些说明,我已经将接收器和发送器配置为。NET核心中的控制台应用程序。但是,当在一个真实的例子中使用它时,我的应用程序接收项目并不是作为使用者收集消息。

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

    }
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();
    }
}
  • 如何在.NET核心中正确配置使用者以使用消息?
  • 期望消息队列管理请求/响应样式的通信是错误的吗?
  • 我是否应该使用API调用来对用户进行身份验证和授权?

共有1个答案

丁雅逸
2023-03-14

@evk提供的答案(在评论中):

using是用来处理东西的,当您到达using块的末尾时,它调用disposebasicconsume不是阻塞调用,因此它开始消耗并立即返回
在此之后,通道和连接都到达using块的末尾,并处理它们(处理它们与关闭相同)。”

我想补充以下内容:如果删除使用很容易带来想要的结果,您可以快速尝试。更改以下代码行:

using (var connection = mqFactory.CreateConnection())
var connection = mqFactory.CreateConnection();
 类似资料:
  • 起码 Java 是一门优美的编程语言,经过10多年的发展,它几乎已经被应用到了任何地方,在高端的企业服务器上, 手持设备的芯片里,车载设备,智能家电甚至火星车上。在力所能及的情况下,最大限度的提高 Java 开发人员的生产力。

  • .NET核心和ASP.NET核心到底有什么区别?

  • 我正在尝试使用iTextSharpLGPLv2将HTML文档转换为PDF。核心nuget库。 我面临的问题是,HTMLWorker不再支持iTextSharper。 下面是我的代码。 任何替代iTextSharper的产品。净核心?或者用其他方法来解决这个问题?

  • SOFARPC 已支持使用 Nacos 作为服务注册中心。假设你已经根据 Nacos 的快速开始在本地部署好 Nacos Server,服务发现的端口默认设置在 8848。 在 SOFARPC 中使用 Nacos 作为服务注册中心只需要在 application.properties 中加入如下配置即可: com.alipay.sofa.rpc.registry.address=nacos://1

  • 使用 Consul 作为服务注册中心需要添加如下依赖 <dependency> <groupId>com.ecwid.consul</groupId> <artifactId>consul-api</artifactId> <version>1.4.2</version> </dependency> 然后在 application.properties 中如下配置: com.alip

  • 使用 Zookeeper 作为服务注册中心只需要在 application.properties 中如下配置即可: com.alipay.sofa.rpc.registry.address=zookeeper://127.0.0.1:2181 注意:考虑掉服务的实时性,以下特性暂不支持 SOFABoot RPC 也提供一个缓存文件(目前暂不支持),当 Zookeeper 不可用时,使用该缓存文件

  • SOFARPC 已支持使用 SOFARegistry 作为服务注册中心。假设你已经根据 SOFARegistry 的快速开始在本地部署好 SOFARegistry Server,服务发现的端口默认设置在 9603。 在 SOFARPC 中使用 SOFARegistry 作为服务注册中心首先要添加如下的依赖: <dependency> <groupId>com.alipay.sofa</grou

  • 我试着把这个项目作为一个正常的参考。但是在重新构建解决方案之后,控制台应用程序仍然没有将.NET核心库作为参考。