无侵入方面编程-用HttpModule+SoapExtension监视页面执行参数(一)

先简单介绍一下项目吧,我们这个项目是用VS2003开发的,老早一个项目。WEB前端机+业务处理 (WebService层)+数据库分别布置在不同的计算机上。

现在老总有一个需求,要统计出每个页 面的执行时间,以及每次调用过哪些WebService方法,调用的时间等参数。

可行的方案有好多, 但我感觉使用HttpModule+SoapExtension,可以不在改变目标系统源码的基础上,完成这项工作。也许 有一天,老总说,现在不需要再统计了,我就直接配置一下,不再统计就行了。

由于要调用 WebService,我们采用编写一个SoapExtension,在它的ProcessMessage函数中,在message.Stage是 BeforeSerialize 时,记一个开始时间,并采集一些数据,在message.Stage==AfterDeserialize时, 再采集一些时间等数据。最后通过HttpContext.Current.Items[WSInvokeMonitorKey]获取HttpModule的 对象,把采集到的数据放在HttpModule里面。

在HttpModule层,我们可以context的 BeginRequest、PreRequestHandlerExecute、PreSendRequestContent、EndRequest中采集数据,最后写 入通过Log4net写入日志文件。

具体实现起来,应该很简单,高手可以略过了。

先看看如 何使用吧,只需在Web.Config中加一条配置:

<configuration>
<system.web>
<httpModules>
<add name="WSInvokeMonitorHttpModule" type="Hebmc.WebTools.WSInvokeMonitor.WSInvokeMonitorHttpModule,WSInvokeMonitor"/& gt;
</httpModules>
<webServices>
<soapExtensionTypes>
<add type="Hebmc.WebTools.WSInvokeMonitor.SimpleWSInvokeMonitorExtension,WSInvokeMonitor&qu ot;
priority="1"
group="0" />
</soapExtensionTypes>
</webServices>
</system.web>
</configuration>

SoapExtension实现:

SoapExtension
public class SimpleWSInvokeMonitorExtension : SoapExtension
{
private const string WSInvokeMonitorKey = "__WSInvokeMonitorKey__";
private WSInvokeInfo invokeInfo = new WSInvokeInfo();
public override System.IO.Stream ChainStream (System.IO.Stream stream)
{
return stream;
}

public override object GetInitializer(Type serviceType)
{
return null;
}

public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{
return null;
}

public override void Initialize (object initializer)
{

}

public override void ProcessMessage(SoapMessage message)
{
if(message is SoapClientMessage)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeSerialize:

// 采集时间
this.invokeInfo.BeginInvokeTime = DateTime.Now;
//采集WebService方法名
this.invokeInfo.MethodName = message.MethodInfo.Name;
break;

case SoapMessageStage.AfterSerialize:
break;

case SoapMessageStage.BeforeDeserialize:
break;

// About to call methods
case SoapMessageStage.AfterDeserialize:

//采集时间
this.invokeInfo.EndInvokeTime = DateTime.Now;

PageInfo pageInfo = (PageInfo) HttpContext.Current.Items[WSInvokeMonitorKey] ;
if(pageInfo != null)
{
//添 加到Module记录
pageInfo.AppendInvokeInfo(this.invokeInfo);
}

break;

// After Method call

default:
throw new Exception("No stage such as this");
}

}
else if(message is SoapServerMessage)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeDeserialize:
break;

case SoapMessageStage.AfterDeserialize:
break;

case SoapMessageStage.BeforeSerialize:
break;

case SoapMessageStage.AfterSerialize:
break;

default:
throw new Exception ("No stage such as this");
}

}
}

}

时间: 2024-08-03 02:39:51

无侵入方面编程-用HttpModule+SoapExtension监视页面执行参数(一)的相关文章

无侵入方面编程-用HttpModule+SoapExtension监视页面执行参数(二)

上一篇文章 "无侵入方面编程-用HttpModule+SoapExtension监视页面执行参数(一)"中 ,我们实现了监视每个页面的执行情况和调用WebService的简单信息. 这次我们继续深入一下SoapExtension的应用,在不改变Soap的WSDL文档的情况下,配合在Dotnet编 写的WebService站点配置我们编写的SoapExtension,来穿透传输我们自定义的数据对象.由于 SoapExtension是全局的,我们还要加一些标识来区分服务器是否已经配置了我们

Dexposed:Android平台免Root无侵入AOP框架

本文来自阿里巴巴技术协会(ATA) 本文首发于 http://www.infoq.com/cn/news/2015/07/dexposed 近日,阿里巴巴无线事业部推出首个重量级Android开源项目,名为Dexposed,是一个Android平台下的无侵入运行期AOP框架.旨在解决像性能监控.在线热补丁等移动开发常见难题,典型使用场景为: AOP编程 插桩 (如测试.性能监控等) 在线热补丁 SDK hooking以提供更好的开发体验 它基于ROOT社区著名开源项目Xposed改造剥离了ROO

postgresql java问题-Postgresql java编程用jdbc连接,怎么样执行postgresql中 d 的查询指令

问题描述 Postgresql java编程用jdbc连接,怎么样执行postgresql中 d 的查询指令 请各位大神帮忙解决一下这个问题:"Postgresql java编程用jdbc连接,怎么样执行postgresql中 d 的查询指令"谢谢. 情况是这样: 我要把所有表的constraints的column找出来,但是我只能通过pg_indexes找到constraints的名字,只有通过d constraints_name 才能找到column,所有请教各位大神有没有解决方法

代码-asp.net页面执行超时,页面无响应

问题描述 asp.net页面执行超时,页面无响应 碰到一个问题,不知道如何解决,求大侠指点. 具体描述如下: 由于存储过程执行时间太长,需要一分多钟,然后asp.net页面就一直处于等待状态,没有响应. function函数收不到回发的数据,没有任何提示. 附上handler页面代码及前台js代码. handler页面部分代码: try { SQLCollector sqlc = new SQLCollector(); sqlc.RunProcedure(strProcName, paras,

一:理解ASP.NET的运行机制(例:通过HttpModule来计算页面执行时间)

一:简要介绍一下asp.net的执行步骤 1.IIS接收到客户请求 2. IIS把请求交给aspnet_isapi.dll处理 3.(如果是第一次运行程序)装载bin目录中的dll 4.(如果是第一次运行程序)读取各级webconfig中的配置 5.(如果是第一次运行程序)编译装载global.asax,初始化HttpApplication实例 6.创建响应请求的HttpContext 7.创建承载响应结果的HttpTextWriter 8.找到合适的HttpHandler(asp.net页面)

C#下的Raw Socket编程实现网络封包监视

编程|网络 谈起socket编程,大家也许会想起QQ和IE,没错.还有许多网络工具如P2P.NetMeeting等在应用层实现的应用程序,也是用socket来实现的.Socket是一个网络编程接口,实现于网络应用层,Windows Socket包括了一套系统组件,充分利用了Microsoft Windows 消息驱动的特点.Socket规范1.1版是在1993年1月发行的,并广泛用于此后出现的Windows9x操作系统中.Socket规范2.2版(其在Windows平台上的版本是Winsock2

用C#下的Raw Socket编程实现网络封包监视

编程|网络 谈起socket编程,大家也许会想起QQ和IE,没错.还有许多网络工具如P2P.NetMeeting等在应用层实现的应用程序,也是用socket来实现的.Socket是一个网络编程接口,实现于网络应用层,Windows Socket包括了一套系统组件,充分利用了Microsoft Windows 消息驱动的特点.Socket规范1.1版是在1993年1月发行的,并广泛用于此后出现的Windows9x操作系统中.Socket规范2.2版(其在Windows平台上的版本是Winsock2

无插件Vim编程技巧

相信大家看过<简明Vim教程>也玩了<Vim大冒险>的游戏了,相信大家对Vim都有一个好的入门了.我在这里把我日常用Vim编程的一些技巧列出来给大家看看,希望对大家有用,另外,也是一个抛砖引玉的过程,也希望大家把你们的技巧跟贴一下,我会更新到这篇文章中.另外,这篇文章里的这些技巧全都是vim原生态的,不需要你安装什么插件.我的Vim的版本是7.2. 浏览代码 首先,我们先从浏览代码开始.有时候,我们需要看多个文件,所以,传统的做法是,我们开多个tty终端,每个tty里用Vim打开一

C++ Traits编程技法--从迭代器的设计看参数推导与类型推导

迭代器与相应类型推导 在写作泛型函数或代码时,我们可能存在这样的需要:与参数相关的其它类型,比如一个迭代器的值的类型,在算法中运用迭代器时,很可能会用到其也叫相应类型(associate type). 什么是相应类型? 迭代器所指之物的类型就是其中一个.如果我们的算法中有必要声明一个变量,以"迭代器所指对象的类别"为型号. 本文要向大家展示一个函数模板推导机制使用技法,这个在STL的迭代器和许多排序算法中广泛使用. 考虑一个情况,我们在写一个泛型函数,它接受一对迭代器,要做的事就是对这