利用HttpModule做流量记录 画蛇添足最后一笔

2024-04-17 01:38

本文主要是介绍利用HttpModule做流量记录 画蛇添足最后一笔,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《利用HttpModule做流量记录》和《利用HttpModule做流量记录 补充》除了得到大家的建议外也饱受非议。在这里要谢谢 kiler 、zoti、武眉博<活靶子.NET>、大石头、古巴、yoshow、ekinwt
、Jeffrey Zhao、slightboy的建议,感谢一下Colin Han、北极熊,我来了!、nasa、雪溯馨风的支持。

利用HttpModule做流量记录的方案已经提出来了,而且也已经决定项目采用这个方案,所以,就算是N多的不好,也还是需要完善一下。下面,我就画蛇添足吧!

方案的瓶颈:
1、加载入了Web请求,给处理增加负担。
2、每次请求页面都会产生巨大的记录数据。保存记录数据时整体性能的损耗。
3、由于流量记录HttpModule异常引发网站请求异常存在危险性。

方案的优势:
1、最大程度保护记录准确性。用户信息基于Session中获取。
2、无需往实际页面中增加任何代码。也无需让所有页面继承任何一个基类。保持网站业务逻辑代码和统计代码分离。
3、可以记录WebService请求(必须开启服务方法Session才能获取保存在Session中的信息)。

我采用降低瓶颈的解决方案
1、数据记录。
最终采用记录入Sql2005数据库,利用异步处理完成并启用连接池。
CS代码——————————————————————————————————————————————————
 /// <summary>
        /// 记录流量信息
        /// </summary>
        /// <param name="flowEntity">流量记录实体</param>
        public void Record(FlowEntity flowEntity)
        {
            //判断连接是否为打开状态
            if (_conn.State != ConnectionState.Open)
                _conn.Open();

     string strCommand = "记录语句";
            SqlCommand dbcommand = new SqlCommand(strCommand, _conn);
            dbcommand.CommandType = CommandType.Text;
           
            dbcommand.Parameters.Add(添加记录需要的参数);
          

            try
            {
                dbcommand.BeginExecuteNonQuery(new AsyncCallback(dbcommandCallBack), dbcommand);

            }
            catch
            {
            }

        }

        public void dbcommandCallBack(IAsyncResult result)
        {
            try
            {
                SqlCommand dbcommand = (SqlCommand)result.AsyncState;
                dbcommand.EndExecuteNonQuery(result);
            }
            catch
            {

            }
        }
web.config 连接字符串——————————————————————————————————————————
<add name="FoutorWebSiteFlowStatisticsDatabaseConnectionString"
   connectionString="Data Source=YourServer;Initial Catalog=FoutorWebSiteFlowStatisticsDatabase;Integrated Security=True;Asynchronous

Processing=true;Pooling=true;MultipleActiveResultSets=true;"
   providerName="System.Data.SqlClient" />
注意必须用:Asynchronous Processing=true;MultipleActiveResultSets=true;声明

关于ADO.net异步处理和Http异步处理可以参考下面的文章
通过 ASP.NET 异步编程实现可扩展的应用程序 http://msdn.microsoft.com/msdnmag/issues/07/03/WickedCode/Default.aspx?loc=zh#void
执行异步操作 http://msdn2.microsoft.com/zh-cn/library/zw97wx20(VS.80).aspx
ADO.NET 2.0中的异步命令执行 http://blog.csdn.net/Aaron_Xie/archive/2007/07/20/1700510.aspx
ADO.NET的新功能:MARS(Multiple Active Result Set) 及 异步执行命令 http://www.cnblogs.com/doll-net/archive/2007/07/23/828043.html

2、关于请求Session的问题。
我曾补充到“
如果选用从Session中传入用户信息或者其他需要记录的信息,请在记录前加判断(2007年8月29日20:34:43增加)
 if (ctx.Handler is Page || ctx.Handler is WebService)
根据需要选用Page还是WebService。
调试过程中发现,如果是其他的类型可能不创建Session,这时从Session读取数据发生错误,造成整个请求中断引起请求失效。这样其他的Module可能不能执行造成页面上一些需要生成的东西无

法生成,例如Asp.net Ajax从WebService生成的脚本类型注册等,引发错误!
尽量捕捉错误,因为这些错误可能不会直接爆出,引发请求中断,让人有的时候摸不着头脑!

但是发现好似用Asp.net Ajax做的WebService放弃捕获,具体原因时间原因没有深究。

这里可以写成这样,更好些

            HttpApplication Application = (HttpApplication)source;
            HttpContext ctx = Application.Context;

            if (!IsFlowType(ctx.Request.Url.AbsoluteUri))
                return;           

            if (ctx.Session!=null)

3、引发异常中断请求。
没有什么好多的了。全部Catch住吧,就不要再抛错误了。最好再Catch里面记录一下错误把。

考虑过的其他解决方案
1、让请求异步处理
通过 ASP.NET 异步编程实现可扩展的应用程序里面的示例代码
using System;
using System.Web;
using System.IO;
using System.Threading;
using System.Text;

public class AsyncRequestLogModule : IHttpModule
{
    private FileStream _file;
    private static long _position = 0;
    private static object _lock = new object();
   
    public void Init (HttpApplication application)
 {
  application.AddOnPreRequestHandlerExecuteAsync (
   new BeginEventHandler (BeginPreRequestHandlerExecute),
   new EndEventHandler (EndPreRequestHandlerExecute)
  );
 }

 IAsyncResult BeginPreRequestHandlerExecute (Object source, EventArgs e,
  AsyncCallback cb, Object state)
 {
        HttpApplication application = (HttpApplication)source;
        DateTime time = DateTime.Now;

        string line = String.Format("{0,10:d}    {1,11:T}    {2, 32}   {3}/r/n",
            time, time,
            application.User.Identity.IsAuthenticated ?
            application.User.Identity.Name :
            application.Request.UserHostAddress,
            application.Request.Url);

        byte[] output = Encoding.ASCII.GetBytes(line);

        lock (_lock)
        {
            _file = new FileStream(HttpContext.Current.Server.MapPath("~/App_Data/RequestLog.txt"),
                FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write, 1024, true);
            _file.Seek(_position, SeekOrigin.Begin);
            _position += output.Length;
            return _file.BeginWrite(output, 0, output.Length, cb, state);
        }
    }

 void EndPreRequestHandlerExecute (IAsyncResult ar)
 {
        _file.EndWrite(ar);
        _file.Close();
    }

 public void Dispose () {}
}

2、利用IIS日志,和form验证配合(大石头的建议)
“如果是我,我会直接使用IIS日志,然后用LogParser,.net调用那个COM,就可以实现很多统计功能”

 

这篇关于利用HttpModule做流量记录 画蛇添足最后一笔的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/910464

相关文章

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 3422 有流量限制的最小费用流 反用求最大 + 拆点

题意: 给一个n*n(50 * 50) 的数字迷宫,从左上点开始走,走到右下点。 每次只能往右移一格,或者往下移一格。 每个格子,第一次到达时可以获得格子对应的数字作为奖励,再次到达则没有奖励。 问走k次这个迷宫,最大能获得多少奖励。 解析: 拆点,拿样例来说明: 3 2 1 2 3 0 2 1 1 4 2 3*3的数字迷宫,走两次最大能获得多少奖励。 将每个点拆成两个

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

perl的学习记录——仿真regression

1 记录的背景 之前只知道有这个强大语言的存在,但一直侥幸自己应该不会用到它,所以一直没有开始学习。然而人生这么长,怎就确定自己不会用到呢? 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。从而减轻手动跑仿真,手动查看log信息的重复无效低质量的操作。下面简单记录下自己的思路并贴出自己的代码,方便自己以后使用和修正。 2 思路整理 作为一个IC d

SSM项目使用AOP技术进行日志记录

本步骤只记录完成切面所需的必要代码 本人开发中遇到的问题: 切面一直切不进去,最后发现需要在springMVC的核心配置文件中中开启注解驱动才可以,只在spring的核心配置文件中开启是不会在web项目中生效的。 之后按照下面的代码进行配置,然后前端在访问controller层中的路径时即可观察到日志已经被正常记录到数据库,代码中有部分注释,看不懂的可以参照注释。接下来进入正题 1、导入m