supersockets命令过滤器
关键字: 命令过滤器, 命令, 过滤器, OnCommandExecuting, OnCommandExecuted
SuperSocket 中的命令过滤器看起来有些像 ASP.NET MVC 中的 Action Filter,你可以用它来做命令执行的拦截,命令过滤器会在命令执行前和执行后被调用。
命令过滤器必须继承于 Attribute 类 CommandFilterAttribute:
/// <summary>
/// Command filter attribute
/// </summary>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public abstract class CommandFilterAttribute : Attribute
{
/// <summary>
/// Gets or sets the execution order.
/// </summary>
/// <value>
/// The order.
/// </value>
public int Order { get; set; }
/// <summary>
/// Called when [command executing].
/// </summary>
/// <param name="commandContext">The command context.</param>
public abstract void OnCommandExecuting(CommandExecutingContext commandContext);
/// <summary>
/// Called when [command executed].
/// </summary>
/// <param name="commandContext">The command context.</param>
public abstract void OnCommandExecuted(CommandExecutingContext commandContext);
}
你需要为你的命令过滤器实现下面两个方法:
OnCommandExecuting: 此方法将在命令执行前被调用;
OnCommandExecuted: 此方法将在命令执行后被调用;
Order: 此属性用于设置多个命令过滤器的执行顺序;
下面的代码定义了一个命令过滤器 LogTimeCommandFilterAttribute 用于记录执行时间超过5秒钟的命令:
public class LogTimeCommandFilter : CommandFilterAttribute
{
public override void OnCommandExecuting(CommandExecutingContext commandContext)
{
commandContext.Session.Items["StartTime"] = DateTime.Now;
}
public override void OnCommandExecuted(CommandExecutingContext commandContext)
{
var session = commandContext.Session;
var startTime = session.Items.GetValue<DateTime>("StartTime");
var ts = DateTime.Now.Subtract(startTime);
if (ts.TotalSeconds > 5 && session.Logger.IsInfoEnabled)
{
session.Logger.InfoFormat("A command '{0}' took {1} seconds!", commandContext.CurrentCommand.Name, ts.ToString());
}
}
}
然后通过增加属性的方法给命令 "QUERY" 应用此过滤器:
[LogTimeCommandFilter]
public class QUERY : StringCommandBase<TestSession>
{
public override void ExecuteCommand(TestSession session, StringCommandInfo commandData)
{
//Your code
}
}
如果你想应用次过滤器给所有的命令, 你可以向下面的代码这样将此命令过滤器的属性加到你的 AppServer 类上面去:
[LogTimeCommandFilter]
public class TestServer : AppServer<TestSession>
{
}
你可以通过将 commandContext's 的 Cancel 属性设为 True 来取消当前命令的执行:
public class LoggedInValidationFilter : CommandFilterAttribute
{
public override void OnCommandExecuting(CommandExecutingContext commandContext)
{
var session = commandContext.Session as MyAppSession;
//If the session is not logged in, cancel the executing of the command
if (!session.IsLoggedIn)
commandContext.Cancel = true;
}
public override void OnCommandExecuted(CommandExecutingContext commandContext)
{
}
}
ServerConfig配置内没有对ipRange的配置,只有ConnectionFilter属性,但完全不起作用,难道只能使用BootstrapFactory启动才能使用连接过滤吗?
supersockets命令过滤器的更多相关文章
- supersocket为动态命令增加命令过滤器
由于我们无法像 C# 中一样方便的将 CLR 属性添加到 Python 文件或者函数中,因此我们需要定义一个函数 "getFilters()" 用于将命令过滤器方会给 CLR 运行 ...
- supersockets接收过滤器(ReceiveFilter)
接收过滤器(ReceiveFilter)用于将接收到的二进制数据转化成请求实例(RequestInfo). 实现一个接收过滤器(ReceiveFilter), 你需要实现接口 IReceiveFilt ...
- grep 命令操作
linux grep命令 1.作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expressi ...
- 由一条Linux的grep命令说起
今天在开发的时候,看到同事使用了这样的一条linux命令 grep 'class YourClass' -rwi * |grep -v svn 想到了 grep命令的,几个参数. -r 明确要求搜索子 ...
- 图解“管道过滤器模式”应用实例:SOD框架的命令执行管道
管道和过滤器 管道和过滤器是八种体系结构模式之一,这八种体系结构模式是:层.管道和过滤器.黑板.代理者.模型-视图-控制器(MVC) 表示-抽象-控制(PAC).微核.映像. 管道和过滤器适用于需要渐 ...
- 强大的grep命令
1.作用 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全 ...
- Grep 命令 用法大全
查找x文件 find / -name "x*" -ls 查找文件中x所在的行数 grep -n "x" -r *find . -name "*.jav ...
- linux grep命令总结
风生水起善战者,求之于势,不责于人,故能择人而任势. 博客园 首页 新随笔 联系 订阅 管理 posts - 791, comments - 394, trackba ...
- Linux Shell编程(23)——文本处理命令
处理文本和文本文件的命令sort文件排序, 通常用在管道中当过滤器来使用. 这个命令可以依据指定的关键字或指定的字符位置, 对文件行进行排序. 使用 -m 选项, 它将会合并预排序的输入文件. 想了解 ...
随机推荐
- 【react】react-reading-track
这是一个很有趣的图书阅读demo 先放github地址:https://github.com/onlyhom/react-reading-track 我觉得这个博主的项目很有意思呢 我们一起看看代码啊 ...
- leetcode 21-30 easy
21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list s ...
- PHPStrom直接在编辑器打开php文件
以下是自己配置PHP+Apache的开发环境,集成环境的话要换第二种方法(看个人配置):PHPStrom 如果希望直接在编辑器打开php文件,要做以下这几步配置. 第一种:非集成环境 1 2 3 第二 ...
- web前端学习(二)html学习笔记部分(6)--fileAPI
1.2.18 html5 File API的应用 1.2.18.1 实现可选择列表 通过为列表项增加一个选择框,进而实现列表的多选和对选择文件的删除.同时,在选择.取消选择时实现操作栏的切换. 1. ...
- JDBC vs Hibernate(转)
jdbc和Hibernate区别 刚开始学习JAVA时,认为Hibernate是一个很神圣的东西,好像是会了SSH,就能走遍全世界一样.记得曾经在枫叶面试的时候,我们几个同学出还说这个公司怎么这么的落 ...
- 洛谷 P1016 旅行家的预算 模拟+贪心
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1016 旅行家的预算 题目描述 一个旅行家想驾驶汽车 ...
- 邀您共赴数据库学术顶会ICDE 2019——阿里云专场 零距离接触达摩院数据库“最强大脑”
摘要: 当学术大家遇到技术大拿,会碰撞出怎样的火花?为进一步加深产学研学术交流,阿里云将于ICDE 2019大会期间(4月9日)举办以“云时代的数据库”为主题的技术专场(Workshop) 作为全球数 ...
- JavaScript学习之 倒计时
倒计时很常见,例如离XX活动还有XX天XX小时XX分XX秒,然后逐秒减少,实现很简单,我只是想记录这过程中的一点小坑. 先上代码: <html> <head> <meta ...
- Linux下配置 Keepalived(心跳检测部署)
首先呢,我想先给大家简单介绍一下什么是keepalived: Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器 ...
- C++:for范围循环特点--自我理解
for(declaration : expression)statement for(xx-type i : P)....其一:for范围类型循环在循环前,可能会对p所在的队列里,对每一个对象进行一次 ...