• SignalR一个集成的客户端与服务器库。内部的两个对象类:PersistentConnection和Hub


    SignalR 将整个交换信息的行为封装得非常漂亮,客户端和服务器全部都使用 JSON 来沟通,在服务器端声明的所有 hub 的信息,都会一般生成 JavaScript 输出到客户端。

    它是基于浏览器的客户端和基于ASP.NET 的服务器组件 可以借助SignalR来进行双向多步对话。就是说 该对话可不受限制的进行 单个无状态请求/响应 数据交换;它将继续,直到明确关闭。  对话通过永久连接进行,允许客户端向服务器发送多个消息,并允许服务器做出相应答复。  它还允许服务器向客户端发送异步消息。

    下面我们来针对Persistent Connection和Hub 做个Demo试试:

    新建一个ASP.NET MVC项目MvcApplicationSignalR,通过Nuget添加SignalR的包。

    新建一个类MyConnection 继承自 PersistentConnection ,引用SignalR命名空间,重写OnReceivedAsync 的方法,并要求 SignalR 对传入的信息做广播

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using SignalR; 
    using System.Threading.Tasks;

    namespace MvcApplicationSignalR 

       public  class MyConnection : PersistentConnection

        { 
           protected override Task OnReceivedAsync(IRequest request, string connectionId, string data) 
            { 
                // Broadcast data to all clients 
                data = string.Format("数据是:{0} 时间是:{1}", data, DateTime.Now.ToString()); 
                return Connection.Send(connectionId, data); 
            }

        } 
    }

    接着在 Global.asax 中加入对应路由信息,这会由 SignalR 的路由表来处理 Metadata 的输出工作,红色部分代码:

    protected void Application_Start() 

        RouteTable.Routes.MapConnection<MyConnection>("echo", "echo/{*operation}");

    这样服务器端就完成了。现在我们在项目中Master、View (Home/Index),然后加入必要的代码:

    <head> 
        <meta charset="utf-8" /> 
        <title>@ViewBag.Title</title> 
        <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> 
        <script src="@Url.Content("~/Scripts/jquery-1.6.4.min.js")" type="text/javascript"></script> 
        <script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script> 
        <script src="@Url.Content("~/Scripts/jquery.signalR-0.5.2.min.js")" type="text/javascript"></script> 
    </head>

    @{ 
        ViewBag.Title = "Home Page"; 

    <script type="text/javascript"> 
        $(function () { 
            var connection = $.connection('echo');

            connection.received(function (data) { 
                $('#messages').append('<li>' + data + '</li>'); 
            });

            connection.start();

            $("#broadcast").click(function () { 
                connection.send($('#msg').val()); 
            }); 
            $("#btnStop").click(function () { 
                connection.stop(); 
            }); 
        });

    </script> 
    <h2>@ViewBag.Message</h2> 
    <input type="text" id="msg" /> 
    <input type="button" id="broadcast" value="发送" /> 
    <input type="button" id="btnStop" value="停止" /> 
    <ul id="messages"> 
    </ul>

    运行起来就是这个效果:

    image

    下面我们来展示 SignalR 的另一个功能:由服务器端调用客户端的 JavaScript 脚本的功能,而这个功能的要求必须是要实现成 Hub 的模式,因此我们可以顺便看到如何实现一个 Hub 类型的 SignalR 应用程序。

    向项目中加入一个类Chat继承自 Hub 类 (这是 Hub 应用程序的要求) :

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using SignalR.Hubs; 
    using System.Threading.Tasks; 
    using System.Threading;

    namespace MvcApplicationSignalR 

       [HubName("geffChat")] 
       public class Chat : Hub  
       { 
           public void SendMessage(string message) 
           { 
               Clients.sendMessage(message); 
           } 
       } 
    }

    这段程序代码的用意是,在连接进到 Hub 时,将连接代码加到联机用户的集合中,等会就会使用到,因为我们会依照客户端的 ID 来调用客户端脚本。

    1. HubName:这个 atttibute 代表 client 端要如何建立对应 server 端对象的 proxy object。通过 HubName , server 端的 class name才不会被 client 绑死。如果没有设定,则会以 server 端 class name 为 HubName 默认值。

    2. 继承 Hub:继承 Hub 之后,很多对应的设计就都不用写了,我们只需要把注意力放在 client 如何送 request 给 server的 hub , server 如何通知 client 即可。

    3. public void SendMessage(string message) ,就像 WebService Method 或 PageMethod 一般, client 端通过 proxy object ,可以直接调用 server 端这个方法。后续会介绍到如何在页面上使用。

    4. Clients 属性:代表所有有使用 Chat 的页面。而 Clients 的型别是 dynamic ,因为要直接对应到 JavaScript 的对象。

    5. Clients.sendMessage(message):代表 server 端调用 Clients 上的 sendMessage 方法,也就是 JavaScript 的方法。

    6. 总结: Chat 对象职责就是当 client 端调用SendMessage() 方法后,要把这个 message ,送给所有 client 页面上呈现。以达到聊天室的功能。

    服务端的做完了,开始制作客户端,同样在Home/Index页面上增加以下html代码

    <%--很重要的一个参考,一定要加,且在这一行之前,一定要先参考jQuery.js与signalR.js--%> 
    <script src="@Url.Content("~/signalr/hubs")" type="text/javascript"></script>

    @{ 
        ViewBag.Title = "Home Page"; 

    <script type="text/javascript"> 
        $(function () { 
            var connection = $.connection('/echo');    

            connection.received(function (data) { 
                $('#messages').append('<li>' + data + '</li>'); 
            });

            connection.start();

            $("#broadcast").click(function () { 
                connection.send($('#msg').val()); 
            }); 
            $("#btnStop").click(function () { 
                connection.stop(); 
            });

            // 建立对应server端Hub class的对象,请注意geffChat的第一个字母要改成小写 
            var chat = $.connection.geffChat;

            // 定义client端的javascript function,供server端hub,通过dynamic的方式,调用所有Clients的javascript function 
            chat.sendMessage = function (message) { 
                //当server端调用sendMessage时,将server push的message数据,呈现在wholeMessage中 
                $('#wholeMessages').append('<li>' + message + '</li>'); 
            };

            $("#send").click(function () { 
                //调用叫server端的Hub对象,将#message数据传给server 
                chat.sendMessage($('#message').val()); 
                $('#message').val(""); 
            });

            //把connection打开 
            $.connection.hub.start();

        });

    </script> 
    <h2>@ViewBag.Message</h2> 
    <input type="text" id="msg" /> 
    <input type="button" id="broadcast" value="发送" /> 
    <input type="button" id="btnStop" value="停止" /> 
    <ul id="messages"> 
    </ul>

    <div> 
        <input type="text" id="message" /> 
        <input type="button" id="send" value="发送" /> 
        <div> 
            聊天室内容: 
            <br /> 
            <ul id="wholeMessages"> 
            </ul> 
        </div> 
    </div>

    1. 先引用 jQuery 与 signalR 的 js 文件。

    2. 很重要的一个步骤:加入一个 js 引用,其路径为「根目录/signalr/hubs」。 SignalR 会建立相关的 JavaScript,放置于此。

    3. 通过 $.connection.『server 端的 HubName』,即可建立对应该 hub 的 proxy object。要注意,首字母需小写。

    4. 定义 client 端上,供 server 端通知的 JavaScript function,这边的例子是 sendMessage。

    5. 当按下发送按钮时,调用 server 端的 SendMessage() 方法,只需要直接通过 proxy object 即可。要注意,首字母需小写。

    6. 记得透过 $.connection.hub.start() ,把 connection 打开。

    image

    注意:SingalR 会自动生成一个siganlr/hub 的桥接js..,在本机使用localhost测试都不会有问题。当部署到IIS的时候会发生404错误,是由于被IIS误判可能是虚拟目录…,解决方法是在web.config加入一段:

    <!-- 加入下面这一段-->

    <system.webServer>

    <validation validateIntegratedModeConfiguration="false" />

    <modules runAllManagedModulesForAllRequests="true">

    </modules>

    </system.webServer>

    这是观看别人的,我这种行为属于抄袭,但对于出学的我来说,这只是第一步

  • 相关阅读:
    Uva 10282 Babelfish
    Uva 10340 All in All
    Uva 11218 KTV
    Uva 193 Graph Coloring
    Uva 141 The Spot Game
    Uva 140 Bandwidth
    C#操作注册表(转)
    定位网站目录的各个符号的含义
    asp.net中错误:"The state information is invalid for this page and might be corrupted."
    用JavaScript获取客户端MAC地址(转)
  • 原文地址:https://www.cnblogs.com/ChengBaoke/p/4595408.html
Copyright © 2020-2023  润新知