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>: ' + 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技术站