.NET Core SignalR的使用

微软官方文档
CSDN 教程
简书教程1
简书教程2

在这里插入图片描述

  • 添加ChatHub 继承Hub

using Microsoft.AspNetCore.SignalR;

在这里插入图片描述

//给指定用户发送 Clients.Client(用户名)
//给所有用户发送 Clients.All

using Microsoft.AspNetCore.SignalR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace WebApplication1.Hubs
{
    public class ChatHub : Hub
    {
        //用户登陆后记录
        public async Task UserLogin(string name)
        {
            if (!ChatUser.userlist.Contains(name))
            {
                ChatUser.userlist.Add(name);
                ChatUser._connections.Add(name, Context.ConnectionId);
            }
            else
            {
                //ConnectionId会随着每次登陆而改变
                ChatUser._connections[name] = Context.ConnectionId;
            }
        }

        public async Task SendMessage(string user, string message)
        {
            await Clients.Client(user).SendAsync("ReceiveMessage", user, message);
        }

        public void SendMsgToUser(string fromUser, string toUser, string message)
        {
        //给指定用户发送 Clients.Client(用户名)
        //给所有用户发送 Clients.All 
        Clients.Client(ChatUser._connections[toUser]).SendAsync("ReceiveMessage", fromUser, message);
        }
    }
}
  • 设置 Startup

services.AddSignalR();
endpoints.MapHub(“/chatHub”);

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddSignalR();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
        endpoints.MapHub<ChatHub>("/chatHub");
    });
}

在这里插入图片描述

  • 页面
<div class="container">
    <div class="row">&nbsp;</div>
    <div class="row">
        <div class="col-2">昵称(名称)</div>
        <div class="col-4"><input type="text" id="userInput" value="useradmin" /></div>
    </div>
    <div class="row">
        <div class="col-2">接收(名称)</div>
        <div class="col-4"><input type="text" id="touserInput" /></div>
    </div>
    <div class="row">
        <div class="col-2">发送内容</div>
        <div class="col-4"><input type="text" id="messageInput" /></div>
    </div>
    <div class="row">&nbsp;</div>
    <div class="row">
        <div class="col-6">
            <input type="button" id="sendButton" value="Send Message" />
            <input type="button" id="sendSigleButton" value="Send Sigle Message" />
        </div>
    </div>
</div>
<div class="row">
    <div class="col-12">
        <hr />
    </div>
</div>
<div class="row">
    <div class="col-6">
        <ul id="messagesList"></ul>
    </div>
</div>
<script src="~/js/signalr/dist/browser/signalr.js"></script>
<script src="~/js/chat.js"></script>
//chat.js 部分
"use strict";

var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();

//Disable send button until connection is established
document.getElementById("sendButton").disabled = true;

connection.on("ReceiveMessage", function (user, message) {
    var li = document.createElement("li");
    document.getElementById("messagesList").appendChild(li);
    // We can assign user-supplied strings to an element's textContent because it
    // is not interpreted as markup. If you're assigning in any other way, you 
    // should be aware of possible script injection concerns.
    li.textContent = `${user} says ${message}`;
});

//官方部分
//connection.start().then(function () {
//    document.getElementById("sendButton").disabled = false;
//}).catch(function (err) {
//    return console.error(err.toString());
//});

//document.getElementById("sendButton").addEventListener("click", function (event) {
//    var user = document.getElementById("userInput").value;
//    var message = document.getElementById("messageInput").value;
//    connection.invoke("SendMessage", user, message).catch(function (err) {
//        return console.error(err.toString());
//    });
//    event.preventDefault();
//});


//自己修改部分
connection.start().then(function () {
    document.getElementById("sendButton").disabled = false;
    var fromUser = document.getElementById("userInput").value;
    connection.invoke("UserLogin", fromUser).catch(function (err) {
    })
}).catch(function (err) {
    return console.error(err.toString());
});

document.getElementById("sendSigleButton").addEventListener("click", function (event) {
    console.log("in send methon");
    var fromUser = document.getElementById("userInput").value;
    var toUser = document.getElementById("touserInput").value;
    var message = document.getElementById("messageInput").value;
    connection.invoke("sendMsgToUser", fromUser, toUser, message).catch(function (err) {
        return console.error(err.toString());
    });
    event.preventDefault();
});

效果
三个用户登录:李三、DQY、王五

李三 给 DQY 发送消息 (给指定人发送信息)
除DQY 外其他用户不能看到此消息
在这里插入图片描述DQY收到信息
在这里插入图片描述王五没有任何消息
在这里插入图片描述DQY 回复 李三
在这里插入图片描述李三看到DQY信息
在这里插入图片描述全程聊天中 始终是 1:1 指定用户
王五收不到任何信息
在这里插入图片描述
整个聊天通讯全程 页面是无任刷新和加载

demo
webapi demo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值