首页 > 编程语言 >在ASP.NET Core 中使用 .NET Aspire 消息传递组件

在ASP.NET Core 中使用 .NET Aspire 消息传递组件

时间:2023-11-23 09:46:37浏览次数:45  
标签:Core -- Worker 总线 Azure Aspire 消息传递 NET

前言

云原生应用程序通常需要可扩展的消息传递解决方案,以提供消息队列、主题和订阅等功能。.NET Aspire 组件简化了连接到各种消息传递提供程序(例如 Azure 服务总线)的过程。在本教程中,小编将为大家介绍如何创建一个 ASP.NET Core 应用并将提交的消息将发送到服务总线主题以供订阅者使用。

环境准备

要使用 .NET Aspire,需要在本地安装以下软件:

设置 Azure 服务总线账户

az group create -n <your-resource-group-name> -location eastus
az servicebus namespace create -g <your-resource-group-name> --name <your-namespace-name> --location eastus
az servicebus topic create --g <your-resource-group-name> --namespace-name <your-namespace-name> --name notifications
az servicebus topic subscription create --g <your-resource-group-name> --namespace-name <your-namespace-name> --topic-name notifications --name mobile

备注:your-resource-group-name和your-namespace-name替换为自己值即可。

Azure 身份验证

可以使用无密码身份验证或连接字符串来完成此快速入门。无密码连接使用 Azure Active Directory 和基于角色的访问控制 (RBAC) 连接到服务总线命名空间。无需担心代码、配置文件或安全存储(例如 Azure Key Vault)中存在硬编码连接字符串。

除此之外,还可以使用连接字符串连接到服务总线命名空间,但建议在实际应用程序和生产环境中使用无密码方法。有关更多信息,请阅读身份验证和授权或访问无密码概述页面

创建项目

  1. 在 Visual Studio 顶部,导航到“文件” “新建” “项目”。
  2. 在对话框窗口中,搜索ASP.NET Core并选择ASP.NET Core Web API。选择下一步。
  3. 在“配置新项目”屏幕上:
  • 输入项目名称AspireMessaging。
  • 将其余值保留为默认值,然后选择“下一步”。

添加 Worker Service

接下来,将工作线程服务项目添加到解决方案,以检索和处理发往 Azure 服务总线的消息。

  1. 在解决方案资源管理器中,右键单击顶级AspireMessaging解决方案节点,然后选择“添加” “新项目”。
  2. 搜索并选择Worker Service模板,然后选择Next。
  3. 对于项目名称,输入AspireMessaging.Worker并选择下一步。
  4. 在附加信息屏幕上:
  • 确保选择.NET 8.0 。
  • 确保选中Enlist in .NET Aspire Orchestration并选择Create。

Visual Studio 将项目添加到您的解决方案中,并使用新的代码行更新项目的Program.cs文件:AspireMessaging.AppHost

builder.AddProject<Projects.AspireMessaging_WorkerService>("aspiremessaging.workerservice");

完整的文件结构:

将 .NET Aspire 组件添加到 API

将.NET Aspire Azure 服务总线组件添加到您的AspireMessaging应用程序:

dotnet add package Aspire.Azure.Messaging.ServiceBus --prerelease

在Razor Pages 项目的Program.csAspireMessaging文件中,添加对扩展方法的调用AddAzureServiceBus:

builder.AddAzureServiceBus("serviceBusConnection");

在项目的_appsettings.json文件中AspireMessaging,添加对应的连接信息:

{
  "ConnectionStrings": {
    "serviceBusConnection": "Endpoint=sb://{your_namespace}.servicebus.windows.net/;
          SharedAccessKeyName=accesskeyname;SharedAccessKey=accesskey"
  }
}

备注:将{your_namespace}替换为自己的服务总线空间的名称

创建 API 端点

提供一个端点来接收数据并将其发布到服务总线主题并向订阅者广播。将以下端点添加到AspireMessaging项目中以向主题发送消息:

app.MapPost("/notify", static async (ServiceBusClient client, string message) =>
{
    var sender = client.CreateSender("notifications");

    // Create a batch
    using ServiceBusMessageBatch messageBatch =
        await sender.CreateMessageBatchAsync();

    if (messageBatch.TryAddMessage(
            new ServiceBusMessage($"Message {message}")) is false)
    {
        // If it's too large for the batch.
        throw new Exception(
            $"The message {message} is too large to fit in the batch.");
    }

    // Use the producer client to send the batch of 
    // messages to the Service Bus topic.
    await sender.SendMessagesAsync(messageBatch);

    Console.WriteLine($"A message has been published to the topic.");
})

将 .NET Aspire 组件添加到 Worker Service

将.NET Aspire Azure 服务总线组件添加到AspireMessaging.Worker应用程序:

dotnet add package Aspire.Azure.Messaging.ServiceBus --prerelease

在Razor Pages 项目的Program.csAspireMessaging.Worker文件中,添加对扩展方法的调用AddAzureServiceBus:

builder.AddAzureServiceBus("serviceBusConnection");

在项目的_appsettings.json文件中AspireMessaging.Worker,添加对应的连接信息:

{
  "ConnectionStrings": {
    "serviceBusConnection": "Endpoint=sb://{your_namespace}.servicebus.windows.net/;
        SharedAccessKeyName=accesskeyname;SharedAccessKey=accesskey"
  }
}

备注:将{your_namespace}替换为自己的服务总线空间的名称

处理来自订阅者的消息

当新消息放入队列时messages,工作服务应检索、处理和删除该消息。更新Worker.cs类以匹配以下代码:

public class Worker(
    ILogger<Worker> logger,
    ServiceBusClient client) : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            var processor = client.CreateProcessor(
                "notifications",
                "mobile",
                new ServiceBusProcessorOptions());

            // add handler to process messages
            processor.ProcessMessageAsync += MessageHandler;

            // add handler to process any errors
            processor.ProcessErrorAsync += ErrorHandler;

            // start processing 
            await processor.StartProcessingAsync();

            logger.LogInformation(
                "Wait for a minute and then press any key to end the processing");
            Console.ReadKey();

            // stop processing
            logger.LogInformation("\nStopping the receiver...");
            await processor.StopProcessingAsync();
            logger.LogInformation("Stopped receiving messages");
        }
    }

    async Task MessageHandler(ProcessMessageEventArgs args)
    {
        string body = args.Message.Body.ToString();
        logger.LogInformation("Received: {Body} from subscription.", body);

        // complete the message. messages is deleted from the subscription.
        await args.CompleteMessageAsync(args.Message);
    }

    // handle any errors when receiving messages
    Task ErrorHandler(ProcessErrorEventArgs args)
    {
        logger.LogError(args.Exception, args.Exception.Message);
        return Task.CompletedTask;
    }
}

最后:在本地运行并测试应用程序

  1. 按 Visual Studio 顶部的运行按钮启动 Aspire 应用程序。.NET Aspire 仪表板应用程序应在浏览器中打开。
  2. 在项目页面的aspireweb行中,单击Endpoints列中的链接以打开 API 的 Swagger UI 页面。
  3. 在 .NET Aspire 仪表板上,导航到AspireWorkerService项目的日志。
  4. 返回 Swagger UI 页面,展开/notify端点并选择Try it out。
  5. 在消息输入框中输入测试消息。
  6. 选择执行以发送测试请求。
  7. 切换回AspireWorkerService日志。看到输出日志中打印的测试消息。

参考链接:https://learn.microsoft.com/zh-cn/dotnet/aspire/messaging/quickstart-messaging?tabs=connection-string

.net8系列的另外两篇文章:
.NET 8.0 中有哪些新的变化?
快速入门:构建您的第一个 .NET Aspire 应用程序

扩展链接:

如何使用 Blazor 框架在前端浏览器中导入/导出 Excel XLSX

如何在.NET电子表格应用程序中创建流程图

如何将实时数据显示在前端电子表格中

标签:Core,--,Worker,总线,Azure,Aspire,消息传递,NET
From: https://www.cnblogs.com/powertoolsteam/p/17850840.html

相关文章

  • 基于googlenet网络的动物种类识别算法matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022a 3.算法理论概述       动物种类识别算法基于深度学习技术,尤其是卷积神经网络(CNN),如GoogleNet。这种算法的主要原理是通过学习和识别图像中的特征来预测动物的种类。        GoogleNet,也被......
  • asp.net core 8 目录索引
    netcorenetcore3.1知识累积HttpClientFactory是HttpClient的正确使用方式linux与windows路径字符串中分隔目录级别知识重点asp.netcore3.1CreateDefaultBuilder默认启动解析asp.netcore2.1中间件应用asp.netcore3.1日志记录Loggingasp,netcore3.1的过......
  • 七天.NET 8操作SQLite入门到实战 - 第三天SQLite快速入门
    前言今天我们花费一个小时快速了解SQLite数据类型、SQLite常用命令和语法。七天.NET8操作SQLite入门到实战详细教程第一天SQLite简介第二天在Windows上配置SQLite环境EasySQLite项目源码地址GitHub地址:https://github.com/YSGStudyHards/EasySQLite......
  • core-dns的pod运行失败
    经查询,该问题是由于系统内核版本过高导致的,把系统的内核版本降下来后,coredns运行正常。  ......
  • 一个.Net开源的协作办公套件,包括文档、表格、演示文稿和表单
    推荐一个开源的文档协作办公套件,可以很好的满足团队对方便、高效、安全的方式来处理文档工作,促进团队协作和信息共享。项目简介ONLYOFFICE是一个开源的办公套件,包括文档、表格、演示文稿和表单等应用程序。可以很好低与微软Office兼容,允许多人实时在线对同一个文档进行协作编......
  • 在Linux平台下使用.NET Core访问Access数据库读取mdb文件数据
    今天有群友在群里问C#能不能在Linux下访问Access数据库?我觉得这很有趣,因此研究折腾了一下,也因为很久没有写博文了,所以特意上来写博文分享经验。运行环境操作系统:Ubuntu22.04.3LTS(Jammy)开发工具:VisualStudio2022(17.8.0)运行时版本:.NETRuntime8.0依赖库:unixo......
  • 作为.NET平台下的程序员,需要掌握以下几种主要的架构设计
    作为.NET平台下的程序员,需要掌握以下几种主要的架构设计:桌面应用程序架构:掌握WindowsForms和WPF这两种主要的桌面应用程序开发框架,能够设计并实现功能丰富、用户体验良好的桌面应用程序。Web应用程序架构:熟悉ASP.NETCore框架,掌握MVC(Model-View-Controller)设计模式,能够构建......
  • DELPHI WIn7下使用 NetHttpClient 请求HTPPS 网站
    转载自:WIn7下使用NetHttpClient请求HTPPS网站-EEEEEEEEEEEEEEEEEEE-博客园(cnblogs.com)WIn7下使用NetHttpClient请求HTPPS网站在WIN7下使用HttpClient会报以下两种错;1ServerCertificateInvalidornotpresent2Errorsendingdata:(12175)发生了安......
  • WIZnet socket API 前言
    WIZnetsocketAPIWIZnetsocketAPIs基于BerkeleysocketAPIs,因此有着相似的名字和接口。但是也是有着些许的不同。APIWIZnetBerkeleysocket()OObind()XOlisten()OOconnect()OOaccept()XOrecv()OOsend()OOrecvfrom()OO......
  • Modbus转Profinet网关与流量变送器通讯博图配置
    Modbus转Profinet网关与流量变送器兼容转ModbusTCP协议博图配置首先,我们需要明确电磁流量计的通信协议是Modbus,而西门子1200PLC的通信协议是Profinet。这两种协议在功能和特性上存在一定的差异,因此需要使用兴达易控Modbus转Profinet网关设备进行转换。兴达易控的XD-MDPN100是Prof......