关键字: 命令过滤器, 命令, 过滤器, 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命令过滤器的更多相关文章

  1. supersocket为动态命令增加命令过滤器

    由于我们无法像 C# 中一样方便的将 CLR 属性添加到 Python 文件或者函数中,因此我们需要定义一个函数 "getFilters()" 用于将命令过滤器方会给 CLR 运行 ...

  2. supersockets接收过滤器(ReceiveFilter)

    接收过滤器(ReceiveFilter)用于将接收到的二进制数据转化成请求实例(RequestInfo). 实现一个接收过滤器(ReceiveFilter), 你需要实现接口 IReceiveFilt ...

  3. grep 命令操作

    linux grep命令 1.作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expressi ...

  4. 由一条Linux的grep命令说起

    今天在开发的时候,看到同事使用了这样的一条linux命令 grep 'class YourClass' -rwi * |grep -v svn 想到了 grep命令的,几个参数. -r 明确要求搜索子 ...

  5. 图解“管道过滤器模式”应用实例:SOD框架的命令执行管道

    管道和过滤器 管道和过滤器是八种体系结构模式之一,这八种体系结构模式是:层.管道和过滤器.黑板.代理者.模型-视图-控制器(MVC) 表示-抽象-控制(PAC).微核.映像. 管道和过滤器适用于需要渐 ...

  6. 强大的grep命令

    1.作用 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全 ...

  7. Grep 命令 用法大全

    查找x文件 find / -name "x*" -ls 查找文件中x所在的行数 grep -n "x" -r *find . -name "*.jav ...

  8. linux grep命令总结

    风生水起善战者,求之于势,不责于人,故能择人而任势. 博客园    首页    新随笔    联系    订阅    管理 posts - 791,  comments - 394,  trackba ...

  9. Linux Shell编程(23)——文本处理命令

    处理文本和文本文件的命令sort文件排序, 通常用在管道中当过滤器来使用. 这个命令可以依据指定的关键字或指定的字符位置, 对文件行进行排序. 使用 -m 选项, 它将会合并预排序的输入文件. 想了解 ...

随机推荐

  1. Leetcode617.Merge Two Binary Trees合并二叉树

    给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 ...

  2. spark应用程序引用别的jar包

    第一种方式 操作:将第三方jar文件打包到最终形成的spark应用程序jar文件中 应用场景:第三方jar文件比较小,应用的地方比较少 第二种方式 操作:使用spark-submit提交命令的参数: ...

  3. 设置程序PrivatePath,配置引用程序集的路径(分离exe和dll)

    原文:设置程序PrivatePath,配置引用程序集的路径(分离exe和dll) 有时候我们想让程序的exe文件和dll文件分开在不同目录,这时候可以有3种方法 1.在app.config中配置 &l ...

  4. PHP数据加密和解密

    encrypt.php <?php /** * Passport 加密函数 * * @param string 等待加密的原字串 * @param string 私有密匙(用于解密和加密) * ...

  5. python字符串函数总结

    字符串函数主要分为: 查找: strs = "this is a line of text for test" index1 = strs.find("is") ...

  6. SPARK Day04

    广播变量和累加器 广播变量 广播变量理解图 广播变量使用 val conf = new SparkConf() conf.setMaster("local").setAppName ...

  7. yum install mysql-devel

    linux系统在装mysql相关的包时要先装mysql-deval,这个包包含mysql的相关配置和环境组件 执行yum install mysql-deval

  8. switch范围判断

    <?php function grade($grade){ switch (true) { case $grade>=90: echo 'A'; break; case $grade> ...

  9. python 逗号分隔值文件的操作

  10. [mysql]MySQL Daemon failed to start 2016-08-14 21:27 1121人阅读 评论(18) 收藏

    前两天我们发现发布好的网站不可以进行注册,登陆这些活动,但是访问页面是正常的.于是开始对问题进行排查,首先我们重启了jenkins,但是每次重启都有错误,于是我们只能重启服务器,重启服务器需要重新启动 ...