1.开发(代码下载)
新建一个ASP.NET Web项目,项目类型为MVC,将认证模式改为无身份认证。在程序包管理控制台输入如下语句,安装SignalR
install-package Microsoft.AspNet.SignalR
为了便于管理,在项目中添加一个名为Hubs的文件夹,在文件夹上右键单击,选择Visual C# >> Web >> SignalR >>SignalR 集线器类 ( V2 ),命名为ChatHub,这个类将是我们所有客户端调用的Hub服务,修改代码,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Microsoft.AspNet.SignalR; namespace SignalRChat_Part2.Hubs { public class ChatHub : Hub { public void Send(string name, string message) { //调用所有客户端的addNewMessageToPage function Clients.All.addNewMessageToPage(name, message); } } }
接着,创建OWIN Startup 类,修改代码,代码如下:
using System; using System.Threading.Tasks; using Microsoft.Owin; using Owin; [assembly: OwinStartup(typeof(SignalRChat_Part2.Startup))] namespace SignalRChat_Part2 { public class Startup { public void Configuration(IAppBuilder app) { // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888 app.MapSignalR(); } } }
然后,在HomeController中新增一个Action,命名为Chat,代码如下:
public ActionResult Chat() { return View(); }
最后,创建Chat 视图,修改试图代码,代码如下:
@{ ViewBag.Title = "Chat"; } <h2>Chat</h2> <div class="container"> <input type="text" id="message" /> <input type="button" id="sendmessage" value="Send" /> <input type="hidden" id="displayname" /> <ul id="discussion"> </ul> </div> @section scripts { <!--注意:这里的jQuery脚本已经在模板页_Layout.cshtml中引用--> <script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script> <!--signalr自动生成的脚本--> <script src="~/signalr/hubs"></script> <script> $(function () { //声明hub代理 var chat = $.connection.chatHub; //创建后端要调用的前端function chat.client.addNewMessageToPage = function (name, message) { //将信息添加到页面上 $('#discussion').append('<li><strong>' + htmlEncode(name) + '</strong>:' + htmlEncode(message) + '</li>'); }; //获取输入的名称 $('#displayname').val(prompt('Enter your name:', '')); //将焦点定位在信息输入框中 $('#message').focus(); //开启链接 $.connection.hub.start().done(function () { $('#sendmessage').click(function () { //调用后台hub的Send方法 chat.server.send($('#displayname').val(), $('#message').val()); //清除发送的内容,并将焦点定位到信息框 $('#message').val('').focus(); }); }); //该function防止JS注入 function htmlEncode(value) { var encodeValue = $('<div/>').text(value).html(); return encodeValue; } }); </script> }
运行,效果如图:
2.需注意的
JS在调用Hub时,Hub的首字母小写,不管后端代码是大写还是小写,JS调用时首字母均小写,除非后台Hub类上已经定义了HubName 属性(如:
[HubName("ChatHb")]
),这种情况下,JS调用Hub时,根据HubName属性定义的名称走。