做项目要用到一个聊天室的功能,找了好长时间也找不到合适的案例,后来同事建议我看看SignalR,结果发现网上资料一大片,就是没有自己想要的,后来搬着官方的API看了两天,终于有些了解了。http://www.asp.net/signalr/overview/guide-to-the-api
以下是官方给的一个例子,给大家翻译过来看看(翻译不好的地方大家别见笑,毕竟是新手)
概述
这个例子介绍了用ASP.NET SignalR 2 和 ASP.NET MVC 5开发实时 web 应用程序。 和(SignalR Getting Started tutorial)中的代码是一样的,但是把代码加到了MVC 5应用程序中。
这个话题讲述了以下的SignalR开发任务:
- 添加SignalR库到 MVC 5 应用程序.
- 创建 hub and OWIN 启动类推送内容到客户端.
- 在 web 页面中用 SignalR jQuery 库发送消息并显示来自hub的更新.
以下是完成后的聊天程序在浏览器运行的效果.(本人比较懒,用的都是官方的图片)
步骤:
- 建立工程
- 运行实例
- 检查代码
- 下一步
建立工程
前提条件:
- Visual Studio 2013. 如果没有安装, 到 ASP.NET Downloads 获取免费的 Visual Studio 2013 Express 开发工具.
这一步教你如何创建 ASP.NET MVC 5 应用程序,添加SignalR 库, 创建聊天程序.
1.在 Visual Studio中, 创建一个面向 .NET Framework 4.5的 C# ASP.NET 应用程序, 命名为 SignalRChat,单击OK.
2.在新的 ASP.NET 工程对话框中
, 选择 MVC, 单击 Change Authentication.
3. 在Change Authentication 对话框中选择 No Authentication, 单击 OK
注意:如果您的应用程序选择了不同的身份验证方式 ,Startup.cs
类将会自动创建, 下面的第10步不需要自己创建了.
4.在新的ASP.NET工程对话框中单击OK
5.打开 Tools | Library Package Manager | Package Manager Console(工具|NuGet程序包管理器|程序包管理控制台)运行一下命令。这一步添加 SignalR 功能用的 一系列的脚本文件和 程序集引用。
6.在 Solution Explorer(解决方案资源管理器)中, 打开Scripts 文件夹. 记下工程中为SignalR添加的脚本库。
7.在 Solution Explorer(解决方案资源管理器)中, 右击工程, 选择 Add | New Folder, 添加一个名为 Hubs 的文件夹.
8.右击 Hubs 文件夹, 单击 Add | New Item, 在安装面板中选择 Visual C# | Web | SignalR节点, 从中央面板选择 SignalR Hub Class (v2), 创建一个新的Hub ChatHub.cs.你将使用这个类作为SignalR服务器Hub向所有的客户端发送信息。
9.用以下的代码替换ChatHub类中的代码
using System; using System.Web; using Microsoft.AspNet.SignalR; namespace SignalRChat { public class ChatHub : Hub { public void Send(string name, string message) { // Call the addNewMessageToPage method to update clients. Clients.All.addNewMessageToPage(name, message); } } }
10.创建一个新的类 Startup.cs.把文件的内容改成如下:
using Owin; using Microsoft.Owin; [assembly: OwinStartup(typeof(SignalRChat.Startup))] namespace SignalRChat { public class Startup { public void Configuration(IAppBuilder app) { // Any connection or hub wire up and configuration should go here app.MapSignalR(); } } }
11.编辑HomeController类(Controllers/HomeController.cs),把以下的方法添加到类中。这个方法返回下一步你要创建的Chat 视图。
public ActionResult Chat() { return View(); }
12.右击Views/Home 文件夹,选择Add... | View.(在Chat方法上右击更方便哦)
13.在添加视图对话框中,命名视图为Chat
14.用以下的代码替换Chat.cshtml 中的内容
重要事项: 当你添加SignalR 和其他的脚本库到 Visual Studio 工程时, 程序包管理可能会安装更新版本的SignalR脚本文件. 请确保脚本参照与你工程中安装的脚本库版本一致。
@{ 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 { <!--Script references. --> <!--The jQuery library is required and is referenced by default in _Layout.cshtml. --> <!--Reference the SignalR library. --> <script src="~/Scripts/jquery.signalR-2.1.0.min.js"></script> <!--Reference the autogenerated SignalR hub script. --> <script src="~/signalr/hubs"></script> <!--SignalR script to update the chat page and send messages.--> <script> $(function () { // Reference the auto-generated proxy for the hub. var chat = $.connection.chatHub; // Create a function that the hub can call back to display messages. chat.client.addNewMessageToPage = function (name, message) { // Add the message to the page. $('#discussion').append('<li><strong>' + htmlEncode(name) + '</strong>: ' + htmlEncode(message) + '</li>'); }; // Get the user name and store it to prepend to messages. $('#displayname').val(prompt('Enter your name:', '')); // Set initial focus to message input box. $('#message').focus(); // Start the connection. $.connection.hub.start().done(function () { $('#sendmessage').click(function () { // Call the Send method on the hub. chat.server.send($('#displayname').val(), $('#message').val()); // Clear text box and reset focus for next comment. $('#message').val('').focus(); }); }); }); // This optional function html-encodes messages for display in the page. function htmlEncode(value) { var encodedValue = $('<div />').text(value).html(); return encodedValue; } </script> }
15.保存工程。
运行实例
-
按 F5 运行工程,进入调试模式.
- 在浏览器的地址栏中, 添加 /home/chat 到工程的默认页面URL后面.浏览器实例中加载了Chat页面,并提示输入用户名。
3.输入用户名
4.拷贝浏览器地址栏的URL,并用它打开两个以上的浏览器实例。在每个浏览器实例中,输入唯一的用户名。
5.在每个浏览器实例中,添加一个评论,单击Send。那个评论就显示到所有的浏览器实例中了。
注意: 这个聊天实例没有管理服务器上讨论的context。hub会把评论广播给所有的当前用户。后加入的用户会看到他们加入后添加的消息。
6.以下是chat应用程序在浏览器的运行结果。
7.在解决方案资源管理器中,检查运行程序的 Script Documents 节点。如果你用的是Internet Explorer , 这个节点在调试模式下是可见的。有个hubs 脚本文件是运行时SignalR库动态生成的。这个文件管理着jQuery脚本和服务器端代码的通信。如果你用的不是Internet Explorer,你也可以通过直接浏览的方式访问这个动态hubs文件。例如http://mywebsite/signalr/hubs.
检查代码
SignalR chat 应用程序演示了两个基本的 SignalR开发任务:在服务器端创建hub作为主协调对象,用SignalR jQuery 库发送和接收消息.
SignalR Hubs
在代码实例中 ChatHub 类派生自 Microsoft.AspNet.SignalR.Hub 类. 从 Hub 类派生是建立SignalR应用程序的有效方式。你可以在你的 hub 类上创建公共方法并通过web页面的脚本调用访问这些方法。
在 chat 代码中, 客户端调用 ChatHub.Send 方法发送新消息,通过调用 Clients.All.addNewMessageToPage hub 依次发送消息到所有的客户端。
Send 方法展示了几个 hub 概念 :
- hub 上声明公共方法一边客户端可以调用
- 用 Microsoft.AspNet.SignalR.Hub.Clients 属性访问连接到这个 hub的所有客户端.
- 调用客户端方法(如 addNewMessageToPage方法)更新客户端
public class ChatHub : Hub { public void Send(string name, string message) { Clients.All.addNewMessageToPage(name, message); } }
SignalR 和 jQuery
代码实例中的 Chat.cshtml 视图文件展示了如何使用 SignalR 脚本库和SignalR hub通信. 代码中关键是创建一个自动生成hub代理的参照,声明一个服务器端可以调用的方法推送内容的到客户端,启动一个连接以发送信息到hub.
以下代码声明了一个hub代理的参照。
var chat = $.connection.chatHub;
注意: 在 JavaScript中对服务器端类的参照和它的成员用"骆驼拼写法".代码实例中,参照C# ChatHub类,在JavaScript中为chatHub。如果你想在jQuery中用常规的Pascal拼写法参照ChatHub,就像在C#中一样,修改ChatHub.cs类文件。添加一个using 语句去参照Microsoft.AspNet.SignalR.Hubs命名空间。然后添加HubName属性到ChatHub
类,例如[HubName("ChatHub")]。更新jQuery参照到ChatHub
类。
以下代码展示了如何在脚本中创建一个回调函数。服务器端的hub类调用这个函数把更新内容推送到每个客户端。htmlEncode
方法展示了用HTML编码后在页面展示信息内容,以防脚本注入。
chat.client.addNewMessageToPage = function (name, message) { // Add the message to the page. $('#discussion').append('<li><strong>' + htmlEncode(name) + '</strong>: ' + htmlEncode(message) + '</li>'); };
以下代码展示了如何用hub打开一个连接。代码启动连接并传递给它一个方法去处理Chat页面上Send按钮的click事件
$.connection.hub.start().done(function () { $('#sendmessage').click(function () { // Call the Send method on the hub. chat.server.send($('#displayname').val(), $('#message').val()); // Clear text box and reset focus for next comment. $('#message').val('').focus(); }); });
下一步
你知道了SignalR是用于建立实时web应用程序的框剪。你也知道了几个SignalR的开发任务:如何添加SignalR到 ASP.NET 应用程序,如何创建hub 类,如何发送和接收来自hub的消息。
你可以用这个教程创建一个实例或者部署字在托管服务提供商,可以通过Internet使用的其他的SignalR应用程序。在Windows Azure trial account中,微软提供的免费网站托管多达10个站点。如何部署一个简单的SignalR应用程序,请访问Using SignalR with Windows Azure Web Sites。获取更多关于如何部署一个 Visual Studio web工程到Windows Azure 网站,请访问Deploying an ASP.NET Application to a Windows Azure Web Site.
了解更多高级的SignalR开发观念,访问一下站点获取SignalR的源代码和资源。