跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C#

基于 .NET 8 Web API 的 RabbitMQ 消息队列应用

介绍如何在 .NET 8 Web API 项目中集成 RabbitMQ。内容包括 RabbitMQ 简介与优势、Windows 环境下的安装配置、创建 Web API 项目、定义产品模型、配置 Entity Framework Core 数据库上下文、实现 RabbitMQ 生产者接口与服务层逻辑,以及通过控制器暴露 RESTful 接口并发送消息。

GopherDev发布于 2026/3/27更新于 2026/7/2440 浏览
基于 .NET 8 Web API 的 RabbitMQ 消息队列应用

本文将向您展示如何在 C# 应用程序中使用 RabbitMQ。我将解释如何使用 Web API、RabbitMQ 如何广播以及客户端应用程序如何使用广播消息。

RabbitMQ

什么是 RabbitMQ 及其功能?

RabbitMQ 是一款开源消息代理软件,可促进分布式应用程序各个组件之间的通信和数据交换。RabbitMQ 充当消息队列,管理从发送者(生产者)到接收者(消费者)的消息路由、排队和传递。

  • 解耦应用程序:RabbitMQ 可用于解耦应用程序,这意味着它们可以相互通信,而无需成为一个整体。
  • 实现异步通信:RabbitMQ 可用于实现异步通信,这意味着消息的发送和接收不会阻塞发送者或接收者。
  • 实时流:RabbitMQ 可用于实现实时流,这意味着消息是实时传递的。
  • 负载平衡:RabbitMQ 可用于在不同的消费者之间平衡消息负载。
  • 故障转移:RabbitMQ 可以为应用程序提供故障转移功能。这意味着,如果一个 RabbitMQ 节点发生故障,另一个节点可以接管并继续传递消息。
  • 审计:RabbitMQ 可用于审计消息。这意味着您可以跟踪消息的发送者和接收者,以及消息的发送和接收时间。
  • 监控:可以监控 RabbitMQ 以跟踪其性能和健康状况。

RabbitMQ 的优势

多平台通信意味着消息以 JSON 等常用语言进行序列化/反序列化。对于这个非常庞大的社区来说,开源可以开发和改进这些问题。灵活、可靠、可扩展。支持多种协议(STOMP、MQTT、RPC、HTTPS、HTTP 等)。

RabbitMQ 安装

由于我使用的是 Windows 操作系统,因此请下载适用于 Windows 的 RabbitMQ。

RabbitMQ 下载链接及安装过程

默认配置

  • 端点地址:http://localhost:15672/
  • 登录:访客
  • 密码:guest
  • Windows 服务名称:RabbitMQ
  • 如果未启动,则启动服务的 Windows 菜单项:RabbitMQ 服务 - 启动

创建 Dotnet core webapi 并广播消息(使用最新的 .NET 8)。

工具:Visual Studio 2022 检查最新的 dotnet 版本 打开 CMD 并输入:dotnet --version 查看所有版本:dotnet --list-SDKs

步骤 1.添加新的 dotnet webapi 项目。

文章配图

步骤 2.选择框架。

文章配图

步骤 3.创建项目,并请检查并确认该项目是.net 8 框架。

文章配图

开始编码

添加 NewFolder 调用模型,并添加名为 Product.cs 的产品模型类。

namespace RabbitMQProductApi.Models
{
    public class Product
    {
        public int ProductID { get; set; }
        public string ProductName { get; set; } = string.Empty;
        public string ProductDescription { get; set; } = string.Empty;
        public int ProductPrice { get; set; }
        public int ProductStock { get; set; }
    }
}

添加 NewFolder 调用 RabbitMQ,添加 RabbitMQ 接口名称同 IRabbitMQProducer.cs。

namespace RabbitMQProductApi.RabbitMQ
{
    public interface IRabbitMQProducer
    {
        public void SendProductMessage<T>(T message);
    }
}

添加一个新的 RabbitMQProducer 类并使用 IRabbitMQProducer 接口。请从 nuget.org 安装最新的 RabbitMQ.Client。

using RabbitMQ.Client;

namespace RabbitMQProductApi.RabbitMQ
{
    public class RabbitMQProducer : IRabbitMQProducer
    {
        public void SendProductMessage<T>(T message)
        {
            var factory = new ConnectionFactory() { HostName = "localhost" };
            var connection = factory.CreateConnection();
            var channel = connection.CreateModel();
            channel.QueueDeclare(queue: "ProductQueue", durable: false, exclusive: false, autoDelete: false, arguments: null);
            var json = System.Text.Json.JsonSerializer.Serialize(message);
            var body = System.Text.Encoding.UTF8.GetBytes(json);
            channel.BasicPublish(exchange: "", routingKey: "ProductQueue", basicProperties: null, body: body);
        }
    }
}

添加一个名为 Data 的新文件夹(用于数据库目的),请确保您已使用 nuget.org 为该项目安装了 实体框架。

using Microsoft.EntityFrameworkCore;
using RabbitMQProductApi.Models;

namespace RabbitMQProductApi.Data
{
    public class DBContextClass : DbContext
    {
        protected readonly IConfiguration Configuration;
        public DBContextClass(IConfiguration configuration)
        {
            Configuration = configuration;
        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("Server=Machine Name;Database=ProductDB;Trusted_Connection=True;");
            optionsBuilder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
        }

        public DbSet<Product> Products { get; set; }
    }
}

添加 NewFolder 服务并使用 IProductService.cs 添加服务接口名称。

namespace RabbitMQProductApi.Services
{
    public interface IProductServices
    {
        public IEnumerable<Product> GetProducts();
        public Product GetProduct(int id);
        public Product AddProduct(Product product);
        public Product UpdateProduct(Product product);
        public bool DeleteProduct(int id);
        public bool DeleteProduct(Product product);
    }
}

添加 ProductService.cs 类使用 IProductServices。

namespace RabbitMQProductApi.Services
{
    public class ProductServices : IProductServices
    {
        private readonly DBContextClass _dbContext;
        public ProductServices(DBContextClass dbContext)
        {
            _dbContext = dbContext;
        }

        public IEnumerable<Product> GetProducts()
        {
            return _dbContext.Products.ToList();
        }

        public Product GetProduct(int id)
        {
            return _dbContext.Products.FirstOrDefault(x => x.ProductID == id);
        }

        public Product AddProduct(Product product)
        {
           var result = _dbContext.Products.Add(product);
            _dbContext.SaveChanges();
            return result.Entity;
        }

        public Product UpdateProduct(Product product)
        {
            var result = _dbContext.Products.Update(product);
            _dbContext.SaveChanges();
            return result.Entity;
        }

        public bool DeleteProduct(int id)
        {
           var result = _dbContext.Products.FirstOrDefault(x => x.ProductID == id);
            if (result != null)
            {
                _dbContext.Products.Remove(result);
                _dbContext.SaveChanges();
                return true;
            }
            return false;
        }

        public bool DeleteProduct(Product product)
        {
            var result = _dbContext.Products.FirstOrDefault(x => x.ProductID == product.ProductID);
            if (result != null)
            {
                _dbContext.Products.Remove(result);
                _dbContext.SaveChanges();
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

添加迁移脚本,在包管理器控制台中执行以下命令。

add-migration "ProductMigration"

然后通过传递以下命令来更新数据库。

update-database

生成的迁移脚本内容如下:

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.CreateTable(
        name: "Products",
        columns: table => new
        {
            ProductID = table.Column<int>(type: "int", nullable: false)
                .Annotation("SqlServer:Identity", "1, 1"),
            ProductName = table.Column<string>(type: "nvarchar(max)", nullable: false),
            ProductDescription = table.Column<string>(type: "nvarchar(max)", nullable: false),
            ProductPrice = table.Column<int>(type: "int", nullable: false),
            ProductStock = table.Column<int>(type: "int", nullable: false)
        },
        constraints: table =>
        {
            table.PrimaryKey("PK_Products", x => x.ProductID);
        });
}

/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
    migrationBuilder.DropTable(
        name: "Products");
}

现在添加 NewFolder,以控制器命名,并添加 ProductController.cs。

namespace RabbitMQProductApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ProductController : ControllerBase
    {
        private readonly IRabbitMQProducer _rabbitMQProducer;
        private readonly ILogger<ProductController> _logger;
        private readonly IProductServices _productService;
        public ProductController(ILogger<ProductController> logger, IProductServices productService, IRabbitMQProducer rabbitMQProducer)
        {
            _logger = logger;
            _productService = productService;
            _rabbitMQProducer = rabbitMQProducer;
        }
        [HttpGet("productlist")]
        public IActionResult GetProducts()
        {
            var products = _productService.GetProducts();
            return Ok(products);
        }
        [HttpGet("product/{id}")]
        public IActionResult GetProduct(int id)
        {
            var product = _productService.GetProduct(id);
            if (product == null)
            {
                return NotFound();
            }
            return Ok(product);
        }
        [HttpPost("addproduct")]
        public IActionResult AddProduct([FromBody] Product product)
        {
            var newProduct = _productService.AddProduct(product);
            _rabbitMQProducer.SendProductMessage(newProduct);
            return Ok(newProduct);
        }
        [HttpPut("updateproduct")]
        public IActionResult UpdateProduct([FromBody] Product product)
        {
            var updatedProduct = _productService.UpdateProduct(product);
            return Ok(updatedProduct);
        }
        [HttpDelete("deleteproduct/{id}")]
        public IActionResult DeleteProduct(int id)
        {
            var result = _productService.DeleteProduct(id);
            if (result)
            {
                return Ok();
            }
            return NotFound();
        }

        [HttpDelete("deleteproduct")]
        public IActionResult DeleteProduct([FromBody] Product product)
        {
            var result = _productService.DeleteProduct(product);
            if (result)
            {
                return Ok();
            }
            return NotFound();
        }
    }
}

使用下面的代码更新 Program.cs 类。

namespace RabbitMQProductApi
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.
            builder.Services.AddScoped<IProductServices, ProductServices>();
            builder.Services.AddDbContext<DBContextClass>();
            builder.Services.AddScoped<IRabbitMQProducer, RabbitMQProducer>();
            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseHttpsRedirection();

            app.UseAuthorization();

            app.MapControllers();

            app.Run();
        }
    }
}

现在构建项目并在本地机器上运行它。

文章配图

将项目添加到产品数据库中。

文章配图

请检查数据库。

文章配图

完毕

下一部分将会看到如何在客户端应用程序中使用消息。

目录

  1. 什么是 RabbitMQ 及其功能?
  2. RabbitMQ 的优势
  3. RabbitMQ 安装
  4. 默认配置
  5. 开始编码
  6. 完毕
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • SharpaWave 视觉基触觉手量产,0.005N 超敏感知与模块化设计
  • 实战:如何利用 AI 工具简化复杂 SQL 查询与表结构设计
  • RxJava 迁移至 Kotlin Flow 的背压策略对比与实现
  • MaxKB4j 开源 RAG 知识库与工作流平台技术解析
  • GitHub 上那些改变开发习惯的开源项目
  • Docker 私有化部署 Coze 应用实战指南
  • Trae IDE 配置全局 Maven 和 JDK 详解
  • Python 原生实现 KaiwuDB 时序数据库连接池方案
  • Whisper 语音识别案例:语音博客内容索引
  • LLaMA Factory:大语言模型微调的终极开源工具
  • 基于 Ant Design 的前端首页 Header 组件设计
  • 数据结构初阶:树的概念、术语与表示方法
  • VS Code 中 GitHub Copilot 无法自定义模型 API
  • OpenClaw 对接飞书机器人:消息无响应与 Gateway 断开排查
  • CSS 渐变实战:线性、径向与锥形的常用写法
  • RTX 4090 加速国产 AIGC 视频生成:腾讯混元与阿里通义万相
  • JDK 21 安装与环境变量配置指南(Windows)
  • Claude Code 安装指南:终端 AI 编程助手
  • Spring AI MCP Server 核心机制与实战指南
  • 数据产品经理与AI产品经理的核心区别与联系

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online