ASP.NET SignalR HubPipelineModule
时间:2022-04-25
本文章向大家介绍ASP.NET SignalR HubPipelineModule,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
ASP.NET SignalR 1.0 实现的一个特性HubPipeline -实现任何消息incoming和outgoing的拦截。SignalR HubPipeline功能对应的ASP.NET Web API和ASP.NET MVC的 ActionFilter。
下面的方法是作为一个实体在IHubPipelineModule定义:
public interface IHubPipelineModule
{
Func<IHubIncomingInvokerContext, Task<object>> BuildIncoming(Func<IHubIncomingInvokerContext, Task<object>> invoke);
Func<IHubOutgoingInvokerContext, Task> BuildOutgoing(Func<IHubOutgoingInvokerContext, Task> send);
Func<IHub, Task> BuildConnect(Func<IHub, Task> connect);
Func<IHub, Task> BuildReconnect(Func<IHub, Task> reconnect);
Func<IHub, Task> BuildDisconnect(Func<IHub, Task> disconnect);
Func<HubDescriptor, IRequest, bool> BuildAuthorizeConnect(Func<HubDescriptor, IRequest, bool> authorizeConnect);
Func<HubDescriptor, IRequest, IList<string>, IList<string>> BuildRejoiningGroups(Func<HubDescriptor, IRequest, IList<string>, IList<string>> 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<string, DateTime> _connections = new ConcurrentDictionary<string, DateTime>();
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());
}
- 平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。
- python接口自动化4-绕过验证码登录(cookie)
- 洛谷P1313 计算系数【快速幂+dp】
- python接口自动化5-Json数据处理
- Numpy教程第1部分 - 阵列简介(常用基础操作总结)
- Session和Cookies的基本原理
- 浅析Numpy.genfromtxt及File I/O讲解
- 损失函数详解
- 排查Java的内存问题
- 使用两种方法让 ASP.NET Core 实现遵循 HATEOAS 结构的 RESTful API
- 设计模式六大原则(5):迪米特法则
- Selenium2+python自动化61-Chrome浏览器(chromedriver)
- 区块链可以减少社会不平等吗?
- 【干货】不止准确率:为分类任务选择正确的机器学习度量指标(附代码实现)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法