在ASP.NET 5中使用SignalR
(此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注。)
题记:SignalR作为ASP.NET中进行Web实时双向通信的组件,在ASP.NET 5中也得到了同步发展。不过,用法和之前还是在细节上有所不同,而资料又相对稀少。本文就是一个简单的入门向导。
通过SignalR,开发人员可以在ASP.NET开发的Web应用中实现服务器和客户端的双向实时通信。服务器可以即时推送内容给在线的客户端。SignalR首选Web Sockets作为底层实现,针对非现代浏览器也可以回退到其他兼容技术。它的特性很丰富,支持链接管理、分组连接和授权控制等。
在ASP.NET 5时代,SignalR也同步升级到SignalR 3.x,不过Javascript的客户端库还是2.x版本。同时,用法和之前在ASP.NET 4.x时代(比如在ASP.NET MVC 5中)还是有点细微的区别,所以导致参考现有文档可能会遇到错误。那么如何在ASP.NET 5的Web应用中使用SignalR 3呢,下面就简单讲解一下步骤:
1,不用说,一开始就是新建一个ASP.NET 5的Web应用程序项目
2,新建成功后。在Solution Explorer中打开“project.json”文件,在“dependencies”中添加"Microsoft.AspNet.SignalR.Server": "3.0.0-rc1-final",以便引用SignalR的服务端函数库
3,展开“Dependencies”,右击“Bower”节点,选择“Manage Bower Packages…”选项,在Bower包安装界面,切换到“Browse”,搜索“SignalR”并安装。需要注意的是,本文书写的时候只能安装signalr 2.2.0的js函数库,但是不影响使用。
4,创建一个文件夹(比如名为”Hubs“)来包含所有Hub类,建议规范如此,并非强制要求。在Hubs文件夹中添加一个名为ChatHub的类,并继承Microsoft.AspNet.SignalR.Hub。
5,理论上,如果你只打算从服务端往客户端推送消息的话,Hub类里面可以不写任何东西。不过为了实现一个简单的聊天功能,我们还是写点东西,写了两个方法Send和Join供客户端调用。代码如下:
public class ChatHub : Hub
{
public void Send(string message)
{
var name = Context.Request.HttpContext.Session.GetString("name");
Clients.All.addNewMessageToPage(name, message);
} public void Join(string name)
{
Context.Request.HttpContext.Session.SetString("name", name);
}
}
6,然后在Startup.cs文件中,的”ConfigureServices“中添加2行代码services.AddSignalR();services.AddTransient<ChatHub>();。(第二行代码的目的是后续在Hub外部调用客户端方法的时候,可以方便的进行依赖注入。)接着在”Configure“中添加1行代码app.UseSignalR();
7,在视图文件中实现加入、发送消息、显示消息的界面,代码基本参考了(http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr-and-mvc)中的。我添加了加入聊天的功能。另外,引用自动生成的hub代理js文件的地址由”signalr/hubs“变为了”signalr/js“。这个地址,可以在Startup中配置,不过默认值是这个且和之前不同。
8,要从Hub中发送消息到客户端,需要在服务端的代码中通过依赖注入引用IHubContext<ChatHub>,并直接调用dynamic方法。代码如下:
private readonly IHubContext<ChatHub> _hub; public HomeController(IHubContext<ChatHub> hub)
{
_hub = hub;
} public IActionResult SendMessageToClients(string message)
{
_hub.Clients.All.sendMessageFromServer(message);
return Content("<h1>OK</h1>");
}
完整的项目代码共享地址在:https://zyg.blob.core.windows.net/share/ASP.NET%205%20SignalR.zip
在ASP.NET 5中使用SignalR的更多相关文章
- 在 Asp.NET MVC 中使用 SignalR 实现推送功能 [转]
在 Asp.NET MVC 中使用 SignalR 实现推送功能 罗朝辉 ( http://blog.csdn.net/kesalin ) CC许可,转载请注明出处 一,简介 Signal 是微软支持 ...
- Asp.NET MVC 中使用 SignalR 实现推送功能
一,简介Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请 ...
- 在 Asp.NET MVC 中使用 SignalR 实现推送功能
一,简介Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请 ...
- asp.net core 中的SignalR与web前端进行实时通信
一.介绍 SignalR是.net 开源库,用于构建需要实时进行用户交互和数据更新的web应用,如在线聊天,游戏,天气等实时应用程序,且简化了构建实时应用的过程,包括服务端库和js端库,继承了数种常见 ...
- 一、在 ASP.NET Core 中使用 SignalR
一.介绍 SignalR 是一个用于实现实时网站的 Microsoft .NET 库.它使用多种技术来实现服务器与客户端间的双向通信,服务器可以随时将消息推送到连接的客户端. https://docs ...
- 在 ASP.NET Core 中使用 SignalR
https://weblogs.asp.net/ricardoperes/signalr-in-asp-net-core 作者:Ricardo Peres 译者:oopsguy.com 介绍 Sign ...
- 二、在 ASP.NET Core 中使用 SignalR之类库
一.前段代码: @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="view ...
- [Asp.net 开发系列之SignalR篇]专题一:Asp.net SignalR快速入门
一.前言 之前半年时间感觉自己有点浮躁,导致停顿了半年多的时间没有更新博客,今天重新开始记录博文,希望自己可以找回初心,继续沉淀.由于最近做的项目中用到SignalR技术,所以打算总结下Asp.net ...
- 在ASP.NET Core下使用SignalR技术
一.前言 上次我们讲到过如何在ASP.NET Core中使用WebSocket,没有阅读过的朋友请参考 WebSocket in ASP.NET Core 文章 .这次的主角是SignalR它为我们提 ...
随机推荐
- java servlet的工作原理
servlet本质上就是java类嘛.不过是有特殊规范的java类而已.下面就说一说为什么servlet要有特殊规范. 首先,考虑一下什么地方用servlet,WEB应用,而且是需要servlet容器 ...
- JAVA8 十大新特性详解
前言: Java8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章, 例如Playing with Java ...
- Java程序优化的一些最佳实践(转)
衡量程序的标准 衡量一个程序是否优质,可以从多个角度进行分析.其中,最常见的衡量标准是程序的时间复杂度.空间复杂度,以及代码的可读性.可扩展性.针对程序的时间复杂度和空间复杂度,想要优化程序代码,需要 ...
- POJ 2421(prim)
http://poj.org/problem?id=2421 这个题和poj1258是一样的,只要在1258的基础上那么几行代码,就可以A,水. 题意:还是n连通问题,和1258不同的就是这个还有几条 ...
- linux shell 中 printf 与 echo的区别
echo echo是非常常用的shell命令.参数如下: -e:打开反斜杠字符backslash-escaped的解析,即对/n,/t等字符进行解析,而不视之为两个字符 -E:关闭反斜杠字符 ...
- spring boot redis缓存JedisPool使用
spring boot redis缓存JedisPool使用 添加依赖pom.xml中添加如下依赖 <!-- Spring Boot Redis --> <dependency> ...
- C++ 获取vector容器最后一个元素
声明:vector<T> vec; 方法一: return vec.at(vec.size()-1); 方法二: return vec.back(); 方法三: return vec.e ...
- ACM/ICPC 之 BFS(离线)+康拓展开 (HDU1430-魔板)
魔板问题,一道经典的康拓展开+BFS问题,为了实现方便,我用string类来表示字符串,此前很少用string类(因为不够高效,而且相对来说我对char数组的相关函数比较熟),所以在这里也发现了很多容 ...
- Java Web开发框架Spring+Hibernate整合效果介绍(附源码)
最近花了一些时间整合了一个SpringMVC+springAOP+spring security+Hibernate的一套框架,之前只专注于.NET的软件架构设计,并没有接触过Java EE,好在有经 ...
- SQL删除约束
)禁止所有表约束的SQL select 'alter table '+name+' nocheck constraint all' from sysobjects where type='U' )删除 ...