博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET SignalR HubPipelineModule
阅读量:6231 次
发布时间:2019-06-21

本文共 2905 字,大约阅读时间需要 9 分钟。

ASP.NET SignalR 1.0 实现的一个特性HubPipeline -实现任何消息incoming和outgoing的拦截。SignalR HubPipeline功能对应的ASP.NET Web API和ASP.NET MVC的 ActionFilter。

下面的方法是作为一个实体在IHubPipelineModule定义:

public interface IHubPipelineModule{    Func
> BuildIncoming(Func
> invoke); Func
BuildOutgoing(Func
send); Func
BuildConnect(Func
connect); Func
BuildReconnect(Func
reconnect); Func
BuildDisconnect(Func
disconnect); Func
BuildAuthorizeConnect(Func
authorizeConnect); Func
, IList
> BuildRejoiningGroups(Func
, IList
> rejoiningGroups);}

是不是感觉有非常复杂的委托。不用急, HubPipelineModule 类已经为我们实现了大部分的功能,大部分情况下已经够用了,可以继承这个雷重写里面方法就可以了.

public abstract class HubPipelineModule : IHubPipelineModule{    protected virtual bool OnBeforeAuthorizeConnect(HubDescriptor hubDescriptor, IRequest request);    protected virtual bool OnBeforeConnect(IHub hub);    protected virtual void OnAfterConnect(IHub hub);    protected virtual bool OnBeforeReconnect(IHub hub);    protected virtual void OnAfterReconnect(IHub hub);    protected virtual bool OnBeforeOutgoing(IHubOutgoingInvokerContext context);    protected virtual void OnAfterOutgoing(IHubOutgoingInvokerContext context);    protected virtual bool OnBeforeDisconnect(IHub hub);    protected virtual void OnAfterDisconnect(IHub hub);    protected virtual bool OnBeforeIncoming(IHubIncomingInvokerContext context);    protected virtual object OnAfterIncoming(object result, IHubIncomingInvokerContext context);    protected virtual void OnIncomingError(Exception ex, IHubIncomingInvokerContext context);}

这代码看起来是不是和ASP.NET Web API和ASP.NET MVC的 ActionFilter 很相似呢。如果其中称为OnBefore的方法返回false,它会立即结束。

 
public class AntiClickModule : HubPipelineModule{    public AntiClickModule()    {        Interval = 1000;    }    public int Interval { get; set; }    private readonly ConcurrentDictionary
_connections = new ConcurrentDictionary
(); protected override void OnAfterDisconnect(IHub hub) { DateTime lastDateTime; _connections.TryRemove(hub.Context.ConnectionId, out lastDateTime); } protected override bool OnBeforeIncoming(IHubIncomingInvokerContext context) { var now = DateTime.Now; var connectionId = context.Hub.Context.ConnectionId; DateTime lastDateTime; if (_connections.TryGetValue(connectionId, out lastDateTime)) { var span = now - lastDateTime; if (span.TotalMilliseconds < Interval) { return false; } } _connections.AddOrUpdate(connectionId, now, (_, __) => now); return true; }}

记录下连接到每个ID所请求的时间,我们简单地检查下一个请求的时间间隔。  如果2个请求之间的时间差小于我们设定的时间间隔,直接返回。

您可以把它添加到使用GlobalHost的模块Global.asax.cs

protected void Application_Start(object sender, EventArgs e){    GlobalHost.HubPipeline.AddModule(new AntiClickModule());}

转载地址:http://kwqna.baihongyu.com/

你可能感兴趣的文章
前端妹纸的进阶之路——redux源码分析
查看>>
Centos7下使用gitolite搭建git服务器
查看>>
如何更好的编写async函数
查看>>
【前端工程师手册】JavaScript之this的笔记
查看>>
使用nginx来为你在一台服务器部署多个Web Server
查看>>
G5 Capital 与 SegmentFault 达成战略合作
查看>>
抽象类和接口的区别
查看>>
Vue 组件详解
查看>>
前端面试题-主流浏览器内核
查看>>
JavaScript 进阶知识 - Ajax篇
查看>>
阿里巴巴测试环境稳定性提升实践
查看>>
websocket搭建简单的网页聊天室框架【续1】
查看>>
Scrapy Shell
查看>>
array_merge和+号合并数组的区别
查看>>
TP5整合 WorkerMan 以及 GatewayWorker
查看>>
Facebook Docusaurus 中文文档 准备网站
查看>>
如何绘制一个圆圆的loading圈
查看>>
Nodejs学习记录:用koa.js开发微信公众号
查看>>
Android源码集锦,悬浮窗综合资讯类APP动画效果左右切换效果美妆领域
查看>>
Spring Cloud(六)服务网关 zuul 快速入门
查看>>