由于直接提供一个“完美无瑕、开箱即用”的源码包不太现实(因为 .NET 版本、数据库、具体需求千差万别),我将为您提供几种方案:

(图片来源网络,侵删)
- 完整的、可运行的源码项目推荐:一个功能相对齐全、基于最新技术栈的项目,适合学习和二次开发。
- 分步教程 + 源码片段:手把手教你从零开始构建一个简单聊天室,并提供关键代码。
- 其他资源(如 GitHub 搜索):教你如何自己寻找更多相关项目。
功能完整的源码项目推荐 (推荐)
这个项目是一个基于 ASP.NET Core SignalR 的现代化聊天室,是目前构建实时聊天应用的最佳选择。
项目特点:
- 技术栈:ASP.NET Core + SignalR + Entity Framework Core + SQL Server
- 功能:
- 用户登录/注册
- 实时群聊
- 在线用户列表
- 发送表情
- 显示发送时间
- 响应式设计(支持手机和电脑)
- 优点:代码结构清晰,注释详细,是学习和实践 SignalR 的绝佳范例。
如何获取和运行:
-
下载源码:
- 访问 GitHub 项目地址:https://github.com/aspnet/ChatR
- 点击页面上的绿色的 "<> Code" 按钮,然后选择 "Download ZIP" 将整个项目下载到本地。
-
环境准备:
(图片来源网络,侵删)- 安装 .NET 6.0 SDK 或更高版本。
- 安装 SQL Server (可以是本地安装的 SQL Server,也可以是 SQL Server Express LocalDB,Visual Studio 通常会自带)。
-
配置和运行:
- 解压:将下载的 ZIP 文件解压到一个英文路径下(
D:\Projects\ChatR),避免因中文路径导致问题。 - 恢复依赖:打开命令行,进入解压后的文件夹,执行
dotnet restore,这一步会下载项目所需的所有 NuGet 包。 - 配置数据库连接字符串:
- 打开
ChatR文件夹下的appsettings.json文件。 - 找到
ConnectionStrings节点,修改DefaultConnection的值,使其指向你的 SQL Server,如果你使用的是 LocalDB,通常默认值就可以工作。"ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-ChatR-...;Trusted_Connection=True;MultipleActiveResultSets=true" }
- 打开
- 创建数据库:
- 在命令行中,确保你在
ChatR文件夹下,执行dotnet ef database update,这个命令会根据你的Models和DbContext自动创建数据库和表。
- 在命令行中,确保你在
- 运行项目:
- 在命令行中,继续执行
dotnet run。 - 稍等片刻,命令行会显示应用已启动,并附上一个 URL,通常是
https://localhost:5001和http://localhost:5000。 - 在浏览器中打开
https://localhost:5001(推荐使用 https,因为 SignalR 在现代浏览器中更稳定)。
- 在命令行中,继续执行
- 解压:将下载的 ZIP 文件解压到一个英文路径下(
-
体验:
- 你会看到登录/注册页面,注册一个新用户或登录。
- 进入聊天室后,就可以开始发送消息,并实时看到自己和其他用户的消息了。
手把手教你从零开始构建一个简单聊天室
如果你不想直接下载完整项目,而是想理解其核心原理,可以跟着这个教程走,我们将使用最简单的方式,不涉及数据库,只做演示。
步骤 1:创建 ASP.NET Core Web 应用
- 打开 Visual Studio 2025。
- 选择“创建新项目”。
- 搜索并选择 “ASP.NET Core Web 应用” 模板,点击“下一步”。
- 输入项目名称(如
SimpleChatRoom),选择位置,点击“下一步”。 - 在框架选择中,选择 .NET 8.0 (或更高版本)。
- 其他选项保持默认,点击“创建”。
步骤 2:安装 SignalR
在“解决方案资源管理器”中,右键点击你的项目 -> “管理 NuGet 程序包”。
搜索 Microsoft.AspNetCore.SignalR,并安装最新版本。

(图片来源网络,侵删)
步骤 3:创建 SignalR Hub
Hub 是 SignalR 的核心,它负责处理客户端和服务器之间的实时通信。
- 在项目中,创建一个新的文件夹
Hubs。 - 在
Hubs文件夹中,添加一个新类ChatHub.cs。 - 将以下代码粘贴进去:
// Hubs/ChatHub.cs
using Microsoft.AspNetCore.SignalR;
namespace SimpleChatRoom.Hubs
{
// ChatHub 继承自 Hub,这是 SignalR 提供的基础类
public class ChatHub : Hub
{
// 当一个客户端连接时调用
public override async Task OnConnectedAsync()
{
// 将客户端添加到 "ChatRoom" 这个组中
await Groups.AddToGroupAsync(Context.ConnectionId, "ChatRoom");
// 通知组内所有客户端,有新用户加入
await Clients.Group("ChatRoom").SendAsync("ReceiveMessage", "System", $"{Context.ConnectionId} has joined the chat.");
}
// 当一个客户端断开连接时调用
public override async Task OnDisconnectedAsync(Exception? exception)
{
// 从 "ChatRoom" 组中移除客户端
await Groups.RemoveFromGroupAsync(Context.ConnectionId, "ChatRoom");
// 通知组内所有客户端,有用户离开
await Clients.Group("ChatRoom").SendAsync("ReceiveMessage", "System", $"{Context.ConnectionId} has left the chat.");
await base.OnDisconnectedAsync(exception);
}
// 定义一个客户端可以调用的方法,用于发送消息
public async Task SendMessage(string user, string message)
{
// 调用 "ChatRoom" 组中所有客户端的 "ReceiveMessage" 方法
await Clients.Group("ChatRoom").SendAsync("ReceiveMessage", user, message);
}
}
}
步骤 4:配置服务和中间件
你需要告诉 ASP.NET Core 应用你的 Hub 在哪里,并启用 SignalR。
打开 Program.cs 文件,修改如下:
// Program.cs
var builder = WebApplication.CreateBuilder(args);
// 1. 添加 SignalR 服务到依赖注入容器
builder.Services.AddSignalR();
// Add services to the container.
builder.Services.AddControllersWithViews();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
// 2. 将 SignalR Hub 映射到指定的 URL 路径
app.MapHub<SimpleChatRoom.Hubs.ChatHub>("/chatHub"); // 注意这里的命名空间要对应
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
步骤 5:创建前端页面
- 在
Views/Home文件夹下,打开Index.cshtml文件,替换其内容为:
@{
ViewData["Title"] = "Chat Room";
}
<!DOCTYPE html>
<html>
<head>ASP.NET Core SignalR Chat</title>
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; }
.container { max-width: 800px; margin: 0 auto; padding: 20px; }
#messages { list-style-type: none; margin: 0; padding: 0; height: 400px; overflow-y: scroll; border: 1px solid #ccc; }
#messages li { padding: 5px 10px; }
#messages li:nth-child(odd) { background: #eee; }
#usernameInput, #messageInput { width: 100%; padding: 10px; margin-bottom: 10px; box-sizing: border-box; }
#sendButton { width: 100%; padding: 10px; background-color: #007bff; color: white; border: none; cursor: pointer; }
</style>
</head>
<body>
<div class="container">
<h1>ASP.NET Core SignalR Chat</h1>
<ul id="messages"></ul>
<input type="text" id="usernameInput" placeholder="User" />
<input type="text" id="messageInput" placeholder="Message" />
<button id="sendButton">Send Message</button>
</div>
<!-- 引入 SignalR 客户端库 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/8.0.0/signalr.min.js"></script>
<script>
// 1. 创建连接
const connection = new signalR.HubConnectionBuilder()
.withUrl("/chatHub") // 与 Program.cs 中的路径保持一致
.configureLogging(signalR.LogLevel.Information)
.build();
// 2. 定义一个客户端方法,用于接收服务器发送的消息
connection.on("ReceiveMessage", (user, message) => {
const encodedMsg = `${user} says: ${message}`;
const li = document.createElement("li");
li.textContent = encodedMsg;
document.getElementById("messages").appendChild(li);
});
// 3. 启动连接
async function start() {
try {
await connection.start();
console.log("SignalR Connected.");
} catch (err) {
console.log(err);
setTimeout(start, 5000);
}
};
connection.onclose(async () => {
await start();
});
// 启动连接
start();
// 4. 发送消息
document.getElementById("sendButton").addEventListener("click", (event) => {
const user = document.getElementById("usernameInput").value;
const message = document.getElementById("messageInput").value;
if (message) {
// 调用服务器端的 SendMessage 方法
connection.invoke("SendMessage", user, message).catch(function (err) {
return console.error(err.toString());
});
document.getElementById("messageInput").value = '';
}
});
// 回车键发送消息
document.getElementById("messageInput").addEventListener("keypress", (event) => {
if (event.key === 'Enter') {
document.getElementById("sendButton").click();
}
});
</script>
</body>
</html>
步骤 6:运行和测试
按 F5 运行项目,打开两个或多个浏览器窗口,访问 https://localhost:xxxx (xxxx 是你的端口号)。
在不同的窗口中输入不同的用户名和消息,你将看到消息在所有窗口中实时同步显示。
其他资源搜索技巧
除了上述推荐,你还可以在 GitHub 上搜索更多项目。
搜索关键词(英文效果最好):
asp.net core chat roomsignalr chat exampleasp.net mvc chat applicationc# websocket chat(SignalR 底层使用 WebSocket,所以结果会高度相关)
搜索时可以加上筛选条件:
language:c#topic:chattopic:signalr
注意事项:
- 技术栈:注意项目是基于 ASP.NET MVC (旧) 还是 ASP.NET Core (新),新项目推荐使用 Core。
- 活跃度:查看项目的提交记录、Issue 和 Pull Request,一个活跃维护的项目通常更可靠。
- 文档:好的项目通常有清晰的 README 文件,告诉你如何运行。
希望这份详细的指南能帮助你找到或构建出你需要的 ASP.NET 聊天室!
