• Asp.Net SignalR


    持久连接类

    通过SignalR持久连接类可以快速的构建一个即时通讯的应用,上篇博文已经我们创建一个owin Startup类和一个持久连接类来完成我们的工作,然后在Startup类的Configuration方法中添加了我们的中间件,配置名称 myconnection1

    image

    简单看一下持久连接类,里面有四个可供我们重写的方法,从字面上就可以看出是什么意思,需要一提的是持久连接类是享元模式的实践,因为一个客户端和服务器的连接过程中只会创建一个对象,后面都不会再创建对象。

    image

    在调试窗口也可以看到我们的WriteLine信息

    HX~T2(J4YKHLV{$KU[21U`L

    下面需要说一下两个参数

    request

    connectionid

    connectionId是一个类似GUID一样的唯一标识,一个客户端的连接会有一个这样的连接Id

    Request则是一些浏览器发来的报文以及一些其它的信息

    image

     

    下面可以看深入一下持久连接类的源码,可以看到参数 environment 是一个字典,这是owin的规范

    public Task ProcessRequest(IDictionary<string, object> environment)
            {
                HostContext context = new HostContext(environment);
                environment.DisableRequestCompression();
                environment.DisableResponseBuffering();
                OwinResponse response = new OwinResponse(environment);
                response.get_Headers().Set("X-Content-Type-Options", "nosniff");
                if (this.Authorize(context.Request))
                {
                    return this.ProcessRequest(context);
                }
                if ((context.Request.User != null) && context.Request.User.Identity.IsAuthenticated)
                {
                    response.set_StatusCode(0x193);
                }
                else
                {
                    response.set_StatusCode(0x191);
                }
                return TaskAsyncHelper.Empty;
            }

    最后会走到这个方法到达我们的OnConnected事件里

    private Task ProcessStartRequest(HostContext context, string connectionId)
            {
                return this.OnConnected(context.Request, connectionId).OrEmpty().Then<HostContext>(((Func<HostContext, Task>) (c => SendJsonResponse(c, "{ "Response": "started" }"))), context).Then<IPerformanceCounterManager>(delegate (IPerformanceCounterManager c) {
                    c.ConnectionsConnected.Increment();
                }, this.Counters);
            }

    上面过多关注了服务器这边的配置,是时候把注意力转移到前端代码上

    let conn = $.connection("/myconnection");
            conn.start(function () {
                conn.send("你好啊");
            });
            //会出错
            conn.send("你好啊");
    
            conn.received(function (data) {
                console.log("service :" + data);
            });

    start方法是异步的,也就如果调用了start方法后立即去发送 msg 可能是会出错的,因为那时候可能还没有连接,在start方法里再进行我们的send是不错的选择。

    received方法,这似乎没有什么好说的,,,所以就不说了

    和服务器端类似,需要我们关于的也仅是这些方法,相信这是很容易去理解的

    image

    关于跨域

    现在跨域请求越来越多的场景里被使用,现在的主流方案有 JSONP和CORS,对于signalR也是对这两种方式进行了封装,根据当前浏览器的情况进行最佳选择

    配置也是非常简单的,但是对于CORS 需要使用nuget下载Microsoft.Owin.Cors包,当然除了这些设置外还需要在headers中进行添加报文

    public void Configuration(IAppBuilder app)
            {
                // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888
    
                app.Map("/myconnection",o=> {
    
                    o.RunSignalR<MyConnection1>(new Microsoft.AspNet.SignalR.ConnectionConfiguration() {
                        //开启jsonp
                        EnableJSONP = true
                    });
                    //开启 cros
                    o.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
                });
            }
        }
  • 相关阅读:
    RunLoop学习总结
    单例模式探索
    HTTPS的学习总结
    Objective-C 链式编程思想
    iOS开发之计算动态cell的高度并缓存
    iOS开发之SDWebImage详解
    HDU 1211 RSA(快速幂)
    HDU 4965 Fast Matrix Calculation (矩阵快速幂)
    POJ 3233 Matrix Power Series(矩阵快速幂+二分求和)
    POJ 3518 (筛素数)
  • 原文地址:https://www.cnblogs.com/LiangSW/p/6337403.html
Copyright © 2020-2023  润新知