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日

相关文章

  • 详解ABP框架中领域层的领域事件Domain events

    ABP框架是一套现代化的ASP.NET Core框架,提供了领域驱动设计(DDD)所需要的一些重要组件和模块。其中领域事件(Domain events)是ABP框架中领域层的一个重要概念,本文将详细解析ABP框架中领域层的领域事件。 领域事件概述 领域事件是一个有状态的对象,用于描述在系统中发生的一些重要事情。域事件是不可修改的,因为它们都是不可变的。领域事…

    C# 2023年6月3日
    00
  • C#中ManualResetEvent用法总结

    下面将为您详细讲解C#中ManualResetEvent用法总结的完整攻略。 什么是ManualResetEvent? ManualResetEvent是System.Threading命名空间中的一个类,是用于线程同步的一种工具。它可以让线程之间进行信号通讯,实现线程之间的同步和互斥。通常情况下,ManualResetEvent作为线程协调的一种机制,可以…

    C# 2023年6月6日
    00
  • 各种AJAX方法的使用比较详解

    AJAX(Asynchronous JavaScript and XML)是一种用于创建异步Web应用程序的技术。它可以在不刷新整个页面的情况下更新部分页面内容,提高Web应用程序的响应速度和用户体验。本文将介绍各种AJAX方法的使用,包括XMLHttpRequest、jQuery AJAX和Fetch API。 XMLHttpRequest XMLHttp…

    C# 2023年5月15日
    00
  • .NET Core Web APi类库内嵌运行的方法

    以下是“.NET Core Web API类库内嵌运行的方法”的完整攻略: 什么是.NET Core Web API类库内嵌运行 .NET Core Web API类库内嵌运行是一种机制,它允许您将.NET Core Web API类库嵌入到其他应用程序中,并在应用程序中运行它们。这种机制可以使您的应用程序更加灵活和可扩展。 .NET Web API类库内嵌…

    C# 2023年5月12日
    00
  • C# 连接本地数据库的实现示例

    下面是详细的攻略: C# 连接本地数据库的实现示例 在 C# 中,连接本地数据库需要使用 .Net Framework 中的 ADO.NET 技术。 常见的本地数据库包括 Access 和 SQL Server Express, 下面将以连接 SQL Server Express 为例,讲解如何连接本地数据库。 使用 SQL Server Managemen…

    C# 2023年6月1日
    00
  • C#实现发送邮件的三种方法

    具体的C#实现发送邮件的三种方法攻略如下: 一、使用SMTP客户端库发送邮件 步骤: 引用System.Net.Mail命名空间 csharp using System.Net.Mail; 创建SmtpClient对象,并设置邮件服务器和端口号等相关信息 csharp SmtpClient smtpClient = new SmtpClient(“smtp.…

    C# 2023年6月3日
    00
  • ASP.NET Core在Linux下为dotnet创建守护进程

    ASP.NET Core在Linux下为dotnet创建守护进程 在Linux下,可以使用systemd来创建守护进程,以确保ASP.NET Core应用程序在系统启动时自动启动,并在崩溃时自动重启。本攻略将提供一些示例,演示如何在Linux下为dotnet创建守护进程。 步骤 步骤1:创建.NET Core Web API项目 首先,需要创建一个.NET …

    C# 2023年5月17日
    00
  • C#探秘系列(一)——ToDictionary,ToLookup

    C#探秘系列(一)——ToDictionary,ToLookup 概述 ToDictionary和ToLookup都是基于IEnumerable的扩展方法,可以将IEnumerable转换为Dictionary和ILookup。两个方法所能承载的数据结构不同,具体使用也有细微差别,下面我们来逐一讲解。 ToDictionary 描述 ToDictionary…

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