学习SignalR(一):搭建及简单通信
文章目录
前言
1、环境:服务端使用 .net 7.0 WebAPI,客户端使用 Winform
2、我用的端口是5000
,所以我的 WebAPI 地址是 http://localhost:5000/
,如果部署到 IIS 服务,5000端口号需改成IIS配置的端口号
3、目的是为了了解 signalR 的客户端是如何连接、发送、接收等和服务端的发送消息
一、服务端
1.依赖注入服务,配置signalR路由
Program.cs:
...
builder.Services.AddSignalR();//注册SignalR
...
//signalR路由:http://localhost:5000/MyHub
app.MapHub<MyHub>("/MyHub"); //配置signalR路由(字符串里的不区分大小写)
app.Run();
2.创建MyHub,用作处理客户端 - 服务器通信的高级管道
MyHub.cs:
public class MyHub : Hub
{
/// <summary>
/// 连接SignalR
/// </summary>
/// <returns></returns>
public override Task OnConnectedAsync()
{
Console.WriteLine($"{Context.ConnectionId}:已连接");
return base.OnConnectedAsync();
}
/// <summary>
/// 断开
/// </summary>
/// <param name="exception"></param>
/// <returns></returns>
public override Task OnDisconnectedAsync(Exception exception)
{
Console.WriteLine($"{Context.ConnectionId}:已断开");
return base.OnDisconnectedAsync(exception);
}
/// <summary>
/// 接收客户端发来的信息,并向客户端发送消息
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public Task SendTest(string str)
{
Console.WriteLine($"{Context.ConnectionId}客户端发来消息:{str}");
return Clients.Caller.SendAsync("SendMessageTest", "好的,我已收到");
}
}
二、客户端
1.安装包
Microsoft.AspNetCore.SignalR.Client
2.界面及代码
代码:
注:txtMessage.WriteLog(ex);为打印日志,是我自己封装的方法,也可以 MessageBox.Show()
public partial class FrmSignalRClient : Form
{
public FrmSignalRClient()
{
InitializeComponent();
}
HubConnection connection;
private void FrmSignalRClient_Load(object sender, EventArgs e)
{
//这里的 url 就是 WebAPI 配置 signalR 的路由
string url = "http://localhost:5000/MyHub";
//创建连接对象
connection = new HubConnectionBuilder().WithUrl(url).Build();
//注册收到服务端数据的方法,此方法请转至服务端MyHub.cs中查看
connection.On<string>("SendMessageTest", str =>
{
txtMessage.WriteLog($"来自服务器的消息:{str}");
});
}
private void btnConnect_Click(object sender, EventArgs e)
{
try
{
//开始连接(必须放On后面,否则一连上,接收不到服务端发来的第一条消息)
connection.StartAsync();
}
catch (Exception ex)
{
txtMessage.WriteLog(ex);
}
}
private void btnSend_Click(object sender, EventArgs e)
{
string msg = txtSend.Text;
connection.InvokeAsync("SendTest", msg);
}
private void btnStop_Click(object sender, EventArgs e)
{
connection.StopAsync();
}
}
三、效果图
微软学习文档:
点击查看
如果有什么问题,欢迎提出