Asp.net SignalR创建实时聊天应用程序

Asp.net SignalR是微软推出的一个开源的库,可以用来开发实时应用程序,例如:聊天应用、实时消息推送、实时数据更新等等。

下面是创建Asp.net SignalR实时聊天应用程序的完整攻略步骤:

步骤1:创建Asp.net MVC项目

首先,在Visual Studio中创建Asp.net MVC项目,命名为ChatRoom。

步骤2:添加SignalR依赖项

在Visual Studio中,打开NuGet包管理器控制台,运行以下命令:

Install-Package Microsoft.AspNet.SignalR

这将会安装SignalR所必需的dll文件、js文件、CSS文件等依赖项。

步骤3:创建Hub类

在ChatRoom项目中创建一个名为ChatHub.cs的类,该类将会是与客户端进行通讯的核心。ChatHub类需要继承自SignalR提供的Hub类,并重写OnConnected、OnDisconnected和Send方法,如下:

using Microsoft.AspNet.SignalR;

namespace ChatRoom
{
    public class ChatHub : Hub
    {
        public void Send(string name, string message)
        {
            Clients.All.broadcastMessage(name, message);
        }

        public override Task OnConnected()
        {
            // Do something when a client connects
            return base.OnConnected();
        }

        public override Task OnDisconnected(bool stopCalled)
        {
            // Do something when a client disconnects
            return base.OnDisconnected(stopCalled);
        }
    }
}

Send方法将会在客户端发送消息时调用,可以使用Clients.All.broadcastMessage()将消息广播到所有连接的客户端。OnConnected方法将会在客户端连接到Hub时调用,OnDisconnected方法将会在客户端断开连接时调用。

步骤4:配置SignalR

打开ChatRoom项目中的Startup.cs文件,在Configure方法中添加SignalR中间件配置,并指定Hub的路由地址,如下:

public void Configure(IApplicationBuilder app)
{
    app.UseMvc();

    app.UseSignalR(routes =>
    {
        routes.MapHub<ChatHub>("/chat");
    });
}

这将会将ChatHub映射到/chat路径上,可以在客户端的javascript代码中使用。

步骤5:创建客户端界面

创建一个Index.cshtml视图页面,在该页面中引用SignalR相关的js和CSS文件,并写入聊天室的HTML和javascript代码,如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>SignalR Chat Room</title>
    <link href="~/Content/chat.css" rel="stylesheet" />
</head>
<body>
    <div id="chatroom">
        <ul id="messages"></ul>
        <input type="text" id="message" />
        <input type="button" id="sendmessage" value="Send" />
    </div>
    <script src="~/Scripts/jquery.signalR-2.4.2.min.js"></script>
    <script src="/chat/hubs"></script>
    <script>
        $(function () {
            var chat = $.connection.chatHub;

            chat.client.broadcastMessage = function (name, message) {
                // Handle message received from server
                var encodedName = $('<div />').text(name).html();
                var encodedMsg = $('<div />').text(message).html();
                $('#messages').append('<li><strong>' + encodedName + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
            };

            $('#sendmessage').click(function () {
                // Call server Send method
                chat.server.send($('#message').val());
                $('#message').val('').focus();
            });

            $.connection.hub.start().done(function () {
                // Do something after successful connection
            });
        });
    </script>
</body>
</html>

步骤6:运行应用程序

运行ChatRoom应用程序,即可看到一个简单的聊天室页面,在该页面中可以发送消息,消息将会广播到所有连接的客户端。

到这里,一个Asp.net SignalR实时聊天应用程序就已经创建完成了。

下面是一个示例说明,演示如何在Asp.net SignalR中使用Redis Scaleout。

示例1:使用Redis Scaleout

在大型应用程序中,可能会遇到单台服务器无法处理所有的SignalR连接的问题。为了解决这个问题,SignalR提供了多种Scaleout方案之一是Redis Scaleout,可以跨多台服务器广播消息。

首先,需要将Redis服务器安装在本地或者远程服务器上,并安装StackExchange.Redis.NuGet包(需要.NET 4.5及以上版本)。

然后,需要修改ChatRoom项目中的Startup.cs文件,在Configure方法中添加以下代码:

public void Configure(IApplicationBuilder app)
{
    app.UseMvc();

    var redisConnection = Configuration.GetConnectionString("RedisServer");
    var redis = ConnectionMultiplexer.Connect(redisConnection);

    app.UseSignalR(routes =>
    {
        routes.MapHub<ChatHub>("/chat");
    });

    // Use Redis Scaleout
    GlobalHost.DependencyResolver.UseRedis(redis, "ChatRoom");
}

这里使用.NET Core的配置系统来配置Redis连接字符串。然后,将ConnectionMultiplexer对象传递给SignalR的GlobalHost.DependencyResolver.UseRedis方法,这将会启用Redis Scaleout。

示例1说明结束。

示例2:使用Jwt认证

使用Asp.net SignalR提供的Jwt认证可以保护客户端与服务器间的通信。在这个示例中,需要安装安装Microsoft.Owin.Security.Jwt Nuget包。

首先,需要添加一个JwtMiddleware类来实现Jwt认证:

using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using Microsoft.IdentityModel.Tokens;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Jwt;

namespace ChatRoom
{
    public class JwtMiddleware : AuthenticationMiddleware<JwtBearerAuthenticationOptions>
    {
        public JwtMiddleware(OwinMiddleware next, JwtBearerAuthenticationOptions options) : base(next, options)
        {
        }

        protected override AuthenticationHandler<JwtBearerAuthenticationOptions> CreateHandler()
        {
            return new JwtHandler();
        }

        private class JwtHandler : AuthenticationHandler<JwtBearerAuthenticationOptions>
        {
            private const string Secret = "ThisIsASecretKeyThatIsNotVerySecure"; // TODO: This should be stored securely

            protected override async Task<AuthenticationTicket> AuthenticateCoreAsync()
            {
                string token = null;

                try
                {
                    var header = Context.Request.Headers["Authorization"].FirstOrDefault();

                    if (header != null && header.StartsWith("Bearer "))
                    {
                        token = header.Substring("Bearer ".Length);
                    }

                    if (string.IsNullOrEmpty(token))
                    {
                        return null;
                    }

                    var claims = new List<Claim>();

                    var validationParameters = new TokenValidationParameters
                    {
                        ValidateIssuerSigningKey = true,
                        IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(Secret)),

                        ValidateIssuer = false,
                        ValidateAudience = false
                    };

                    var tokenHandler = new JwtSecurityTokenHandler();

                    SecurityToken validatedToken;
                    var principal = tokenHandler.ValidateToken(token, validationParameters, out validatedToken);
                    claims.AddRange(principal.Claims);

                    var identity = new ClaimsIdentity(claims, "JwtBearer");
                    var ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
                    return ticket;
                }
                catch (Exception ex)
                {
                    // Log exception
                    return null;
                }
            }
        }
    }
}

然后,在Configure方法中添加Jwt中间件并配置SignalR为使用Jwt认证:

public void Configure(IApplicationBuilder app)
{
    app.Use(new Func<AppFunc, AppFunc>(next => new JwtMiddleware(next, new JwtBearerAuthenticationOptions
    {
        AuthenticationMode = AuthenticationMode.Active,
        TokenValidationParameters = new TokenValidationParameters
        {
            ValidIssuer = "urn:chatroom",
            ValidateIssuer = true,
            ValidAudience = "urn:chatroom",
            ValidateAudience = true,
            IssuerSigningKey = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes("ThisIsASecretKeyThatIsNotVerySecure")),
            ValidateIssuerSigningKey = true
        }
    }).Invoke));

    app.UseMvc();

    app.UseSignalR(routes =>
    {
        routes.MapHub<ChatHub>("/chat");
    });

    GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(10);
    GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30);
    GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(5);

    GlobalHost.HubPipeline.AddModule(new ErrorHandlingPipelineModule());
}

然后,在客户端javascript代码中,需要添加一个jwt认证token,可以在连接成功后向服务器请求一个jwtToken:

$.connection.hub.start().done(function () {
    var jwtToken = '...'; // Get token from server
    $.connection.hub.qs = { "token": jwtToken };
});

示例2说明结束。

到这里,关于Asp.net SignalR创建实时聊天应用程序的完整攻略已经介绍完毕。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Asp.net SignalR创建实时聊天应用程序 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • 快速高效的C#FTP文件传输库FluentFTP

    简介: FluentFTP是一个用于C#语言的FTP客户端库,它提供了许多方便的功能和API,使FTP文件传输变得简单易用。FluentFTP的主要目标是提供简单易用的API,并同时提供足够的灵活性以满足大多数开发人员的需求。 FluentFTP支持FTP和FTPS协议,可以通过简单的API进行连接、上传、下载、删除、重命名等操作。此外,它还支持断点续传、文…

    C# 2023年5月9日
    00
  • 记录.Net部署Docker-v指令使用

    记录Docker的-v指令使用 前言 之前我浅学了一下docker,方便部署.net项目(部署的是打包之后的项目) dockerfile文件如下: FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 5031 EXPOSE 7031 FROM mcr.microsoft.c…

    C# 2023年4月25日
    00
  • C#.net中的类型转换详细介绍

    请看下面的攻略。 C#.net中的类型转换详细介绍 基本概念 在C#.net中,类型转换是指将一种数据类型转换为另一种数据类型的过程。C#.net提供了多种类型转换的方式,例如隐式类型转换、显示类型转换、强制类型转换、装箱和拆箱等。需要注意的是,类型转换可能会造成数据精度的损失或者异常的产生。 隐式类型转换 当一个数据类型可以转换为另一个数据类型时,且转换不…

    C# 2023年5月14日
    00
  • ASP.NET Core选项接口介绍

    ASP.NET Core选项接口介绍 ASP.NET Core选项接口是一种用于管理应用程序配置的机制。它允许我们将应用程序配置分离出来,并将其存储在一个或多个配置源中。本攻略将详细介绍ASP.NET Core选项接口的概念、用法和示例。 什么是选项接口? 选项接口是一种用于管理应用程序配置的机制。它允许我们将应用程序配置分离出来,并将其存储在一个或多个配置…

    C# 2023年5月16日
    00
  • 一则C#简洁瀑布流代码

    下面我将为您详细讲解如何编写一则C#简洁的瀑布流代码: 第一步:确定数据源 首先,我们需要确定我们要用来呈现瀑布流的数据源。这通常是一个包含多个对象的列表,例如,我们可以用以下方式来声明一个包含多个图片信息的列表: List<ImageInfo> images = new List<ImageInfo>(); 其中,ImageInfo…

    C# 2023年6月7日
    00
  • Unity 修改FBX模型动画的操作

    下面是关于“Unity 修改FBX模型动画的操作”的完整攻略,具体内容如下: 1. 导入FBX模型和动画 在Unity的Assets面板中右键点击空白区域,选择Import New Asset,将FBX模型和动画导入到项目中。导入时要确保勾选了Import Animations选项,以便将动画一起导入进来。 2. 创建动画控制器(Controller) 选中…

    C# 2023年6月3日
    00
  • C#使用FolderBrowserDialog类实现选择打开文件夹方法详解

    C#使用FolderBrowserDialog类实现选择打开文件夹方法详解 在C#开发中,文件夹是一个非常常见的操作对象,使用FolderBrowserDialog类可以实现选择打开文件夹的效果。本文将详细讲解如何使用FolderBrowserDialog类实现选择打开文件夹的方法。 使用 FolderBrowserDialog 显示窗口 FolderBro…

    C# 2023年6月1日
    00
  • asp.net中获取客户端IP地址网卡信息等方法的代码

    在ASP.NET中,一般可以通过以下两种方式获取客户端的IP地址。 方法一:通过HttpContext.Current.Request.ServerVariables获取客户端IP地址 string ipAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_F…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部