在ASP.NET Core 中使用 .NET Aspire 消息传递组件
前言
云原生应用程序通常需要可扩展的消息传递解决方案,以提供消息队列、主题和订阅等功能。.NET Aspire 组件简化了连接到各种消息传递提供程序(例如 Azure 服务总线)的过程。在本教程中,小编将为大家介绍如何创建一个 ASP.NET Core 应用并将提交的消息将发送到服务总线主题以供订阅者使用。
环境准备
要使用 .NET Aspire,需要在本地安装以下软件:
- .NET 8.0
- .NET Aspire 工作负载:
- 使用 Visual Studio 安装程序
- 使用dotnet workload install aspire命令
- Docker 桌面
- 集成开发环境 (IDE) 或代码编辑器,例如:
- Visual Studio 2022 预览版 17.9 或更高版本(可选)
- Visual Studio 代码(可选)
设置 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)中存在硬编码连接字符串。
除此之外,还可以使用连接字符串连接到服务总线命名空间,但建议在实际应用程序和生产环境中使用无密码方法。有关更多信息,请阅读身份验证和授权或访问无密码概述页面。
创建项目
- 在 Visual Studio 顶部,导航到“文件” “新建” “项目”。
- 在对话框窗口中,搜索ASP.NET Core并选择ASP.NET Core Web API。选择下一步。
- 在“配置新项目”屏幕上:
- 输入项目名称AspireMessaging。
- 将其余值保留为默认值,然后选择“下一步”。
添加 Worker Service
接下来,将工作线程服务项目添加到解决方案,以检索和处理发往 Azure 服务总线的消息。
- 在解决方案资源管理器中,右键单击顶级AspireMessaging解决方案节点,然后选择“添加” “新项目”。
- 搜索并选择Worker Service模板,然后选择Next。
- 对于项目名称,输入AspireMessaging.Worker并选择下一步。
- 在附加信息屏幕上:
- 确保选择.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;
}
}
最后:在本地运行并测试应用程序
- 按 Visual Studio 顶部的运行按钮启动 Aspire 应用程序。.NET Aspire 仪表板应用程序应在浏览器中打开。
- 在项目页面的aspireweb行中,单击Endpoints列中的链接以打开 API 的 Swagger UI 页面。
- 在 .NET Aspire 仪表板上,导航到AspireWorkerService项目的日志。
- 返回 Swagger UI 页面,展开/notify端点并选择Try it out。
- 在消息输入框中输入测试消息。
- 选择执行以发送测试请求。
- 切换回AspireWorkerService日志。看到输出日志中打印的测试消息。
扩展链接:
如何使用 Blazor 框架在前端浏览器中导入/导出 Excel XLSX
在ASP.NET Core 中使用 .NET Aspire 消息传递组件的更多相关文章
- Asp.Net Core中利用Seq组件展示结构化日志功能
在一次.Net Core小项目的开发中,掌握的不够深入,对日志记录并没有好好利用,以至于一出现异常问题,都得跑动服务器上查看,那时一度怀疑自己肯定没学好,不然这一块日志不可能需要自己扒服务器日志来查看 ...
- 如何在 ASP.Net Core 中使用 Serilog
记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志框架,但如果你的 日志文件 包含非结构化的数据,那么查询起来将是一个噩梦,所以需要在记录日志的时候采用结构化方式. 将 ...
- ASP.NET Core 中的那些认证中间件及一些重要知识点
前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...
- Asp.net Core中使用Session
前言 2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Cor ...
- 在ASP.NET Core中使用百度在线编辑器UEditor
在ASP.NET Core中使用百度在线编辑器UEditor 0x00 起因 最近需要一个在线编辑器,之前听人说过百度的UEditor不错,去官网下了一个.不过服务端只有ASP.NET版的,如果是为了 ...
- ASP.NET Core中的依赖注入(1):控制反转(IoC)
ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制,ASP.NET通过定义接口的方式对它们进行了"标准化&qu ...
- ASP.NET Core中的依赖注入(2):依赖注入(DI)
IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...
- ASP.NET Core中的依赖注入(3): 服务的注册与提供
在采用了依赖注入的应用中,我们总是直接利用DI容器直接获取所需的服务实例,换句话说,DI容器起到了一个服务提供者的角色,它能够根据我们提供的服务描述信息提供一个可用的服务对象.ASP.NET Core ...
- ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理
ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...
- ASP.NET Core 中文文档 第二章 指南(4.6)Controller 方法与视图
原文:Controller methods and views 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘) .张仁建(第二年.夏) .许登洋(Seay) .姚阿勇 ...
随机推荐
- 在Volo.Abp微服务中使用SignalR
假设需要通过SignalR发送消息通知,并在前端接收消息通知的功能 创建SignalR服务 在项目中引用 abp add-package Volo.Abp.AspNetCore.SignalR 在Mo ...
- 通过替换dll实现后门功能的恶意代码
通过替换Kernel32.dll来实现的后门功能的恶意代码. 该恶意代码存在一个exe可执行文件和一个dll动态链接库,需要分别进行分析 一.待解决问题 这个恶意代码执行了什么功能? 通过什么方式实现 ...
- Ubuntu 安装部署Kubernetes(k8s)集群
目录 一.系统环境 二.前言 三.Kubernetes 3.1 概述 3.2 Kubernetes 组件 3.2.1 控制平面组件 3.2.2 Node组件 四.配置节点的基本环境 五.节点安装doc ...
- 使用redis pipeline提升性能
前言 本篇来介绍一下redis pipeline,主要是由于最近一次在帮开发同学review代码的时候,发现对redis有个循环操作可以优化.场景大概是这样的,根据某个uid要从redis查询一批数据 ...
- 手写raft(三) 实现日志压缩
手写raft(三) 实现日志压缩 在上一篇博客中MyRaft实现了日志复制功能,按照计划接下来需要实现日志压缩. 手写raft(一) 实现leader选举 手写raft(二) 实现日志复制 1. 什么 ...
- KRPano插件解密大师更新支持最新版KRPano的XML/JS解密
KRPano插件解密大师是一款专业的全景解密工具,它可以帮助你轻松解密KRPano的XML/JS插件,还能分析下载静态和动态网站的资源.你无需任何编程知识,只需一键点击,就能快速完成解密,学习全景开发 ...
- 安装软件提示 "无法完成操作, 因为文件包含病毒或潜在的垃圾软件" 如何处理
在Windows端安装一些小众电脑软件的时候,经常会遇到无法安装的问题,比较常见的情况是会提示 "无法完成操作, 因为文件包含病毒或潜在的垃圾软件", 或者提示"不能执行 ...
- 「co-examination - A」
破壁,组合意义法: 五种颜色 \(\star,a,b,c,d\). 对于 l.h.s. 钦定 \(k\),在 \(3n+k\) 个球中选出 \(2n\) 个球染色,在靠左的 \(n\) 个球中选 \( ...
- 「openjudge / poj - 1057」Chessboard
link. 调起来真的呕吐,网上又没篇题解.大概是个不错的题. 首先行和列一定是独立的,所以我们把行列分开考虑.这样的问题就弱化为:在一个长度为 \(n\) 的格子带上,有 \(n\) 个物品,每个物 ...
- 【ASP.NET Core】在 Mini-API 中注入服务
经过版本更新,Mini API 的功能逐步完善,早期支持得不太好的 mini API 现在许多特性都可以用了,比如灰常重要的依赖注入. 咱们先来个相当简单的注入测试.来,定义一个服务类,为了偷懒,老周 ...