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# base64转字符串实例

    当我们需要在c#中传递二进制数据时,往往需要将其转换为字符串格式,而常用的方法之一就是使用Base64进行编码。下面是将Base64字符串转换为普通字符串的步骤和示例。 1. C# Base64编码 C#中的Base64编码是通过System.Convert类实现的。该类中含有以下方法可供使用: //将字节数组转换为Base64字符串 string Conv…

    C# 2023年6月1日
    00
  • C#泛型语法详解

    C#泛型语法详解 1.泛型的概念 C#中的泛型是指一种可以将类型参数化的特性。泛型提供了一种创建可重用、类型安全的代码的方法,可以大大简化代码的编写过程。泛型还可以帮助我们避免在强类型语言中最常见的类型转换问题。 2.泛型类型 泛型类型是具有一般性的类型定义,包含泛型类型参数。定义泛型类型可以使用T或其他名字作为泛型类型参数。 public class My…

    C# 2023年6月7日
    00
  • C# 变量,常量数据类型详情

    下面我将为您详细讲解“C# 变量、常量、数据类型”的完整攻略。 变量 变量的定义 在C#中,变量是在使用前需要定义的。定义变量需要指定变量的名称、类型和初始值(可选)。变量的定义格式如下: data_type variable_name = initial_value; 其中,data_type为数据类型,variable_name为变量名称,initial…

    C# 2023年6月1日
    00
  • C# Process调用外部程序的实现

    下面我来给大家详细讲解一下“C# Process调用外部程序的实现”的完整攻略。 什么是Process类 Process类是.NET Framework中一个系统级别的类,它提供了一种机制来与操作系统中运行的进程进行交互。通过使用Process类,我们可以创建、启动、停止和操纵操作系统中的进程,并且可以获取有关进程的信息。在C#中,可以通过引用System.…

    C# 2023年5月31日
    00
  • asp.net ubb使用代码

    当我们在开发一个网站或者一个论坛系统时,通常都需要使用 UBB(ultra bulletin board) 编辑器。在 ASP.NET 中,使用 UBB 编辑器可以轻松实现文字编辑、图片上传、表情等功能。而如何使用 ASP.NET 代码实现 UBB 编辑器的功能呢?下面是一个完整的攻略。 步骤一:引用 UBB 控件 首先,在 ASP.NET 项目中,我们需要…

    C# 2023年5月31日
    00
  • 由vbs sort引发.NET Framework之间的关系说明

    由于题目中缺少具体的上下文,我假设这是一篇介绍VBScript(vbs)和.NET Framework之间关系的文章。以下是完整攻略: 1. VBScript与.NET Framework的关系 VBScript是一种基于COM(Component Object Model)的脚本语言,早期被广泛应用于Windows系统管理和自动化任务。而.NET Fram…

    C# 2023年6月3日
    00
  • ASP.NET延迟调用或多次调用第三方Web API服务

    以下是“ASP.NET延迟调用或多次调用第三方WebAPI服务”的完整攻略: 什么是ASP.NET延迟调用或多次调用第三方WebAPI服务 在ASP.NET中,我们可以使用异步程技术来延调用或多次调用第三方WebAPI服务。这可以提高应用程序的性能和可伸缩性。 延迟调用第三WebAPI服务 以下延迟调用第三方WebAPI服务的步骤: 步骤1:创建HttpCl…

    C# 2023年5月12日
    00
  • 利用Python的Twisted框架实现webshell密码扫描器的教程

    Twisted是一个基于事件驱动的网络框架,可以用于开发高性能、可扩展的网络应用程序。本文将介绍如何使用Python的Twisted框架实现webshell密码扫描器,并提供两个示例。 环境准备 在使用Twisted框架实现webshell密码扫描器前,需要安装Python和Twisted框架。可以使用以下命令来安装Twisted框架: pip instal…

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