SignalR的另类实现技巧,SignalR的简单使用

2019-11-02 01:27 来源:未知

  之前提到SignalR代理在网页,通过生成的Js来完成相关的功能。但我不禁想一个问题,

   ASP.NET SignalR是ASP.NET开发人员的一个新库,它使您的应用程序添加实时Web功能变得非常简单。什么是“实时网络”功能?能够实时地将服务器端代码推送到连接的客户端的能力。

很久之前发表过一篇名为《通过三个DEMO学会SignalR的三种实现方式》的文章,在那篇文章里面详细介绍了在WEB应用下的常用SignalR实现方法,而今天我们来利用SignalR来实现其它的一些用法,比如:B/S 与 C/S互相通讯,比如:C/S与C/S通讯。

难到SignalR的服务端就能寄存在web端吗,通过访问网页能方式才能启动服务,还有客户端

您可能已经听说过WebSockets,一种新的HTML5 API,可以实现浏览器和服务器之间的双向通信。SignalR将在可用的封面下使用WebSockets,如果不是,您的应用程序代码保持不变,则可以正常地回退到其他技术和技术。

一、B/S 与 C/S互相通讯(ASP.NET 向  Winform  广播消息),先看效果如下:

也只能在web端吗?经过看官网的教程得到 了结论,两者的答案都是否定的。

SignalR还提供了一个非常简单的高级API,用于在ASP.NET应用程序中执行服务器到客户端RPC(在客户端的浏览器中从服务器端.NET代码调用JavaScript函数),以及为连接管理添加有用的钩子,例如连接/断开事件,分组连接,授权。

图片 1

关于上一篇的hub名第一个为小写的问题,还有调用客户端和服务端方式的问题,后面的教程

                                                                                                                                                                                       ---来自SignalR的官方说明

如上图所示,采用服务端发送消息(指在C#代码发送),然后winform接收消息。

提到,这些名字都是用驼峰命名法的,即使定义时收字母是大写,调用时首字母小写也能调到。

 

图片 2

1.客户端

  根据SignalR的官网教程,做一些简单的解析。

如上图所示,采服客户端(浏览器)JS 代理对象发送消息,然后winform接收消息。

SignalR的客户端可是DOTNET下所有的客户端,包括windowsForm、WPF等。

1.想要使用SignalR要引入它的组建,Microsoft.AspNet.SignalR。

上述示例的实现代码如下:

下列以winform为例说明问题,在DOTNET客户端实现SignalR的客户端需要添加

在你的web项目中,应用NuGet包工具引入。怎么引入包可以到NuGet的官网看教程。

ASP.NET 服务端代码:

组件Microsoft.AspNet.SignalR.Client。

2.新建一个SignalR集线器类,这样就会得到一个集成自Hub的类,

MyHub:

1.1新建Hub连接实例 HubConnection hubConnection=new HubConnection("uri");

可以通过打标签的方式改变集线器的名字,这在客户端代码会用到。

    [HubName("myHub")]
    public class MyHub : Hub
    {
        public static Action<string> SendMsgAction = null;
        public MyHub()
        {
            SendMsgAction = new Action<string>(SendMsg);
        }

        private void SendMsg(string msg)
        {
            Clients.All.RecvMsg(msg);
        }

        [HubMethodName("broadcast")]
        public void Broadcast(string msg)
        {
            if ("broadcast".Equals(Context.QueryString["identity"])) //只有带有广播者身份才能进行广播消息
            {
                SendMsg(msg);
            }
        }


        public override System.Threading.Tasks.Task OnConnected()
        {
            return base.OnConnected();
        }

        [HubMethodName("testConnect")]
        public void TestConnect()
        {
            System.Diagnostics.Debug.Write("ddd");
        }
    }

其中url为SignalR的寄宿地址。这里仍然是寄宿在web端。

方式是[HubName("myHub")],命名空间是在Microsoft.AspNet.SignalR.Hubs下。

ASP.NET 页面:(演示就用了服务器控件,以便到服务端进行发送)

2.新建Hub代理实例 IHubProxy hubProxy=hubConnection.CreateHubProxy("myHub");

3.引入一个配置类,这里用的是Startup,可以通过OWIN Startup类获得。

        <div>
            广播消息:<input type="text" id="txtmsg" runat="server"  />
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="服务端发送" />
        </div>

其中myHub为自定的Hub类。

代码如下:

ASP.NET CS代码:

3.通过代理实例注册客户端实例hubProxy.On("functionName",()=>{MessageBox.Show("可以");});

using Microsoft.Owin;
using 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();
        }
    }
}
        protected void Button1_Click(object sender, EventArgs e)
        {
            if(MyHub.SendMsgAction!=null)
            {
                MyHub.SendMsgAction("服务端发送消息-" + txtmsg.Value);
            }
        }

其中functionName为方法名,后面的为Lamda表达式表示方法体。

  这个类现在的作用就是配置。其中app.MapSignalR();就是配置所有的集线器。

 在这里特别说明一下,因为MyHub是有连接时才会生成实例,我们无法直接在服务端获取到MyHub的实例,所以采取了在MyHub构造函数时,将SendMsg暴露给静态的 SendMsgAction委托,这样服务端就可以直接通过判断SendMsgAction是否有订阅来决定是否可以发送消息。这是一个取巧的的方式,当然如果大家有更好的方法,欢迎交流。

TAG标签:
版权声明:本文由金沙澳门官网4166发布于中国史,转载请注明出处:SignalR的另类实现技巧,SignalR的简单使用