一,简单介绍

Signal 是微软支持的一个执行在 Dot NET 平台上的 html websocket 框架。

它出现的主要目的是实现server主动推送(Push)消息到client页面,这样client就不必又一次发送请求或使用轮询技术来获取消息。

二,实现机制

SignalR 的实现机制与 .NET WCF 或 Remoting 是相似的,都是使用远程代理来实现。

在详细使用上,有两种不同目的的接口:PersistentConnection 和 Hubs,当中
PersistentConnection 是实现了长时间的 Javascript 轮询(类似于 Comet),Hub 是用来解决实时信息交换问题。它是利用 Javascript 动态加载运行方法实现的。SignalR 将整个连接,信息交换过程封装得很美丽,client与server端所有使用 JSON 来交换数据。

三,实现 Hub server端代码

向project中新建 SignalR 文件夹,在当中加入 ChatHub.cs 文件。内容例如以下:

  1. namespace SignalTutorial.SignalR
  2. {
  3. [HubName("chat")]
  4. public class Chat : Hub
  5. {
  6. public void Send(string clientName, string message)
  7. {
  8. //var toSelfinfo = "You had sent message " + message;
  9. //Caller.addSomeMessage(clientName, toSelfinfo);
  10.  
  11. // Call the addMessage method on all clients
  12. Clients.addSomeMessage(clientName, message);
  13. //Clients[Context.ConnectionId].addSomeMessage(clientName, data);
  14. }
  15. }
  16. }

1),HubName 这个特性是为了让client知道怎样建立与server端相应服务的代理对象,假设没有设定该属性,则以server端的服务类名字作为 HubName 的缺省值;

2),Chat 继承自 Hub。从以下 Hub 的接口图能够看出:Hub 支持向发起请求者(Caller)。全部client(Clients),特定组(Group) 推送消息。

3),public void Send(string clientName, string message) 这个接口是被客户端通过代理对象调用的。

4)。Clients 是 Hub 的属性,表示全部链接的client页面,它和 Caller 一样是 dynamic。由于要直接相应到 Javascript 对象。

5),Clients.addSomeMessage(clientName, message); 表示server端调用client的 addSomeMessage 方法,这是一个 Javascript 方法,从而给client推送消息。

6),总结:这里实现的服务非常easy,就是当一个client调用 Send 方法向server发送 message 后。server端负责将该 message 广播给全部的client(也能够给特定组或特定client。见屏蔽代码),以实现聊天室的功能。

四,实现 Hub client代码

  1. <head>
  2. <meta charset="utf-8" />
  3. <title>@ViewBag.Title</title>
  4. <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
  5. <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
  6. <script src="@Url.Content("~/Scripts/jquery-1.6.4.js")" type="text/javascript"></script>
  7. <script src="@Url.Content("~/Scripts/jquery-ui-1.8.24.js")" type="text/javascript"></script>
  8. <script src="@Url.Content("~/Scripts/jquery.signalR-0.5.3.js")" type="text/javascript"></script>
  9. <script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script>
  10. <script src="@Url.Content("~/signalr/hubs")" type="text/javascript"></script>
  11. </head>

注意:signalR 依赖于 jquery。所以 signalR 必须放在 jquery 之后。而 hubs 又必须放在 signalR 之后。

然后在 body 部分增加 HubChat Tab:

  1. @model dynamic
  2.  
  3. @{
  4. ViewBag.Title = "title";
  5. }
  6.  
  7. <script src="@Url.Content("~/Scripts/hubDemo.js")" type="text/javascript"></script>
  8. <script type="text/javascript">
  9. $(document).ready(function () {
  10. });
  11. </script>
  12.  
  13. <h2>Hub Chat</h2>
  14.  
  15. <div>
  16. <input type="text" id="Placeholder" value="@ViewBag.ClientName" hidden="true"/>
  17. <input type="text" id="msg" />
  18. <input type="button" id="broadcast" value="广播" />
  19.  
  20. <br />
  21. <br />
  22.  
  23. <h3>
  24. 消息记录: (你是:<span id="MyClientName">@ViewBag.ClientName</span>):
  25. </h3>
  26.  
  27. <ul id="messages">
  28. </ul>
  29. </div>
  1. Scripts 文件夹加入新的 Javescript 脚本:hubDemo.js。其内容例如以下:
  2.  
  3. $(function () {
  4.  
  5. var myClientName = $('#Placeholder').val();
  6.  
  7. // Proxy created on the fly
  8. var chat = $.connection.chat;
  9.  
  10. // Declare a function on the chat hub so the server can invoke it
  11. chat.addSomeMessage = function (clientName, message) {
  12. writeEvent('<b>' + clientName + '</b> 对大家说: ' + message, 'event-message');
  13. };
  14.  
  15. $("#broadcast").click(function () {
  16. // Call the chat method on the server
  17. chat.send(myClientName, $('#msg').val())
  18. .done(function () {
  19. console.log('Sent message success!');
  20. })
  21. .fail(function (e) {
  22. console.warn(e);
  23. });
  24. });
  25.  
  26. // Start the connection
  27. $.connection.hub.start();
  28.  
  29. //A function to write events to the page
  30. function writeEvent(eventLog, logClass) {
  31. var now = new Date();
  32. var nowStr = now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds();
  33. $('#messages').prepend('<li class="' + logClass + '"><b>' + nowStr + '</b> ' + eventLog + '.</li>');
  34. }
  35. });

我已经执行过一次。能够正常执行。

Persistent Connection部分,下节再介绍。大家假设发现什什么问题。它可以指向。谢谢。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Asp.NET MVC3 使用 SignalR 实现推的更多相关文章

  1. Asp.NET MVC3 使用 SignalR 实现推(持续)

    一,Persistent Connection 演示示例教程 1.实现server端代码 1),编写server PersistentConnection 代码 项目中 SignalR 文件夹下创建 ...

  2. Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)

    简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现 ...

  3. Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室)

    简介       ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端 ...

  4. Asp.NET websocket,Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室)

    ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消息及 ...

  5. WinForm中 Asp.Net Signalr消息推送测试实例

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  6. 在 Asp.NET MVC 中使用 SignalR 实现推送功能 [转]

    在 Asp.NET MVC 中使用 SignalR 实现推送功能 罗朝辉 ( http://blog.csdn.net/kesalin ) CC许可,转载请注明出处 一,简介 Signal 是微软支持 ...

  7. MVC 中使用 SignalR 实现推送功能

    MVC 中使用 SignalR 实现推送功能 一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Pus ...

  8. 史上最全面的SignalR系列教程-3、SignalR 实现推送功能-集线器类实现方式

    1.概述 通过前两篇 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 文章对SignalR的介绍, ...

  9. asp.net core 使用 signalR(一)

    asp.net core 使用 signalR(一) Intro SignalR 是什么? ASP.NET Core SignalR 是一个开源代码库,它简化了向应用添加实时 Web 功能的过程. 实 ...

随机推荐

  1. win7,win8取得管理员权限 .reg文件

    Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\runas] @="获取管理员所有权" " ...

  2. 怎么样Eclipse IDE for C/C++ Developers正确编译GTK规划?(解决)

    <span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 25.99 ...

  3. Zoj 3545 Rescue the Rabbit(ac自己主动机+dp)

    标题效果: 鉴于DNA有一个正确的顺序值.请构造一个长度I的DNA在这个序列使DNA正确的顺序值极大.它被认为是负的输出噼啪. .. IDEAS: 施工顺序是,ac己主动机上走,求最大要用到dp dp ...

  4. 关于委托:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }

    异常{ 无法将 匿名方法 转换为类型"System.Delegate",因为它不是委托类型 } 委托实际上是把方法名作为参数,但是若有好多个方法时,就要指明是哪个参数  查看如下代 ...

  5. ListView的cacheColorHint与listSelector物业和fragment里面onActivityResult问题没有响应

    fragment里面onActivityResult 如何才华被称之为.在使用时发现没反应,没注意这个问题谁. 多方法都不是非常方便.最终实验除了一个最简单的方法. startActivityForR ...

  6. 问题:DataGrid该行并不总是很清楚验证错误(删除), 解决方案,如下面

    转载,收藏转载请注明出处http://blog.csdn.net/metal1/article/details/37568391 景象:于DataGrid进数据有误,行验证返回new Validati ...

  7. 采用Java语言如何实现高速文件复制?

    今天review代码也看到了"大神"用老方法来实现文件拷贝.今天归结一下使用Java语言怎样实现高速文件复制: 代码1--使用文件通道的方式: import java.io.Fil ...

  8. UI —— 计算器

    #import <UIKit/UIKit.h> @interface MyViewController :UIViewController { NSInteger _firstName; ...

  9. eclipse设备SVN插入

    原文:http://www.cnblogs.com/ruiati/p/3584120.html 1.下载最新的Eclipse.我的版本号是3.7.2 indigo(Eclipse IDE for Ja ...

  10. RH033读书笔记(15)-Lab 16 The Linux Filesystem

    Lab 16 The Linux Filesystem Goal: Develop a better understanding of Linux filesystem essentials incl ...