首页 > 代码库 > Asp.Net SignalR - 持久连接类

Asp.Net SignalR - 持久连接类

持久连接类

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

技术分享

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

技术分享

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

技术分享

下面需要说一下两个参数

request

connectionid

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

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

技术分享

 

下面可以看深入一下持久连接类的源码,可以看到参数 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);        }

Asp.Net SignalR - 持久连接类