无侵入方面编程-用HttpModule+SoapExtension监视页面执行参数(一)
2009-05-22 10:51
204 查看
先简单介绍一下项目吧,我们这个项目是用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中加一条配置:
namespace Hebmc.WebTools.WSInvokeMonitor.Data
{
[Serializable]
public class PageInfo
{
private string typeName;
private string pageUri;
private DateTime beginRequestTime = DateTime.Now;
private DateTime preRequestHandlerExecuteTime = DateTime.Now;
private DateTime endRequestTime = DateTime.Now;
private DateTime preSendRequestContentTime = DateTime.Now;
private ArrayList wsInvokeInfoList = new ArrayList();
/// <summary>
/// 类名
/// </summary>
public string TypeName
{
get { return typeName; }
set { typeName = value; }
}
/// <summary>
/// 页面URI
/// </summary>
public string PageUri
{
get { return pageUri; }
set { pageUri = value; }
}
/// <summary>
/// 开始时间
/// </summary>
public System.DateTime BeginRequestTime
{
get { return beginRequestTime; }
set { beginRequestTime = value; }
}
/// <summary>
/// 开始处理时间
/// </summary>
public System.DateTime PreRequestHandlerExecuteTime
{
get { return preRequestHandlerExecuteTime; }
set { preRequestHandlerExecuteTime = value; }
}
/// <summary>
/// 结束处理时间
/// </summary>
public System.DateTime EndRequestTime
{
get { return endRequestTime; }
set { endRequestTime = value; }
}
/// <summary>
/// 向客户端发送数据开始时间
/// </summary>
public System.DateTime PreSendRequestContentTime
{
get { return preSendRequestContentTime; }
set { preSendRequestContentTime = value; }
}
/// <summary>
/// 调用次数
/// </summary>
[XmlIgnore]
public int WSInvokeCount
{
get
{
return this.wsInvokeInfoList.Count;
}
}
/// <summary>
/// 该页面调用的WebService信息
/// </summary>
public WSInvokeInfo[] WSInvokeInfos
{
get
{
return (WSInvokeInfo[])wsInvokeInfoList.ToArray(typeof(WSInvokeInfo));
}
set
{
wsInvokeInfoList.AddRange(value);
}
}
/// <summary>
/// 添加一个调用WebService日志
/// </summary>
/// <param name="info"></param>
public void AppendInvokeInfo(WSInvokeInfo info)
{
wsInvokeInfoList.Add(info);
}
/// <summary>
/// 序列化需要
/// </summary>
public PageInfo()
{}
}
[Serializable]
public class WSInvokeInfo
{
private string methodName;
private DateTime beginInvokeTime = DateTime.Now;
private DateTime endInvokeTime = DateTime.Now;
/// <summary>
/// 函数名
/// </summary>
public string MethodName
{
get { return methodName; }
set { methodName = value; }
}
/// <summary>
/// 开始调用时间
/// </summary>
public System.DateTime BeginInvokeTime
{
get { return beginInvokeTime; }
set { beginInvokeTime = value; }
}
/// <summary>
/// 结束调用时间
/// </summary>
public System.DateTime EndInvokeTime
{
get { return endInvokeTime; }
set { endInvokeTime = value; }
}
}
}
OK了,这个方案还可以继续深入,可以使用SoapExtension把WebService层的采集到的数据,也拉到前端。这样便可以知道一个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中加一条配置:
namespace Hebmc.WebTools.WSInvokeMonitor.Data
{
[Serializable]
public class PageInfo
{
private string typeName;
private string pageUri;
private DateTime beginRequestTime = DateTime.Now;
private DateTime preRequestHandlerExecuteTime = DateTime.Now;
private DateTime endRequestTime = DateTime.Now;
private DateTime preSendRequestContentTime = DateTime.Now;
private ArrayList wsInvokeInfoList = new ArrayList();
/// <summary>
/// 类名
/// </summary>
public string TypeName
{
get { return typeName; }
set { typeName = value; }
}
/// <summary>
/// 页面URI
/// </summary>
public string PageUri
{
get { return pageUri; }
set { pageUri = value; }
}
/// <summary>
/// 开始时间
/// </summary>
public System.DateTime BeginRequestTime
{
get { return beginRequestTime; }
set { beginRequestTime = value; }
}
/// <summary>
/// 开始处理时间
/// </summary>
public System.DateTime PreRequestHandlerExecuteTime
{
get { return preRequestHandlerExecuteTime; }
set { preRequestHandlerExecuteTime = value; }
}
/// <summary>
/// 结束处理时间
/// </summary>
public System.DateTime EndRequestTime
{
get { return endRequestTime; }
set { endRequestTime = value; }
}
/// <summary>
/// 向客户端发送数据开始时间
/// </summary>
public System.DateTime PreSendRequestContentTime
{
get { return preSendRequestContentTime; }
set { preSendRequestContentTime = value; }
}
/// <summary>
/// 调用次数
/// </summary>
[XmlIgnore]
public int WSInvokeCount
{
get
{
return this.wsInvokeInfoList.Count;
}
}
/// <summary>
/// 该页面调用的WebService信息
/// </summary>
public WSInvokeInfo[] WSInvokeInfos
{
get
{
return (WSInvokeInfo[])wsInvokeInfoList.ToArray(typeof(WSInvokeInfo));
}
set
{
wsInvokeInfoList.AddRange(value);
}
}
/// <summary>
/// 添加一个调用WebService日志
/// </summary>
/// <param name="info"></param>
public void AppendInvokeInfo(WSInvokeInfo info)
{
wsInvokeInfoList.Add(info);
}
/// <summary>
/// 序列化需要
/// </summary>
public PageInfo()
{}
}
[Serializable]
public class WSInvokeInfo
{
private string methodName;
private DateTime beginInvokeTime = DateTime.Now;
private DateTime endInvokeTime = DateTime.Now;
/// <summary>
/// 函数名
/// </summary>
public string MethodName
{
get { return methodName; }
set { methodName = value; }
}
/// <summary>
/// 开始调用时间
/// </summary>
public System.DateTime BeginInvokeTime
{
get { return beginInvokeTime; }
set { beginInvokeTime = value; }
}
/// <summary>
/// 结束调用时间
/// </summary>
public System.DateTime EndInvokeTime
{
get { return endInvokeTime; }
set { endInvokeTime = value; }
}
}
}
OK了,这个方案还可以继续深入,可以使用SoapExtension把WebService层的采集到的数据,也拉到前端。这样便可以知道一个WebService方法执行几次数据库连接。嘿嘿。
相关文章推荐
- 无侵入方面编程-用HttpModule+SoapExtension监视页面执行参数(二)
- 无侵入方面编程-用HttpModule+SoapExtension监视页面执行参数(一)
- 无侵入方面编程-用HttpModule+SoapExtension监视页面执行参数(一)
- 无侵入方面编程-用HttpModule+SoapExtension监视页面执行参数(二)
- ASP.NET页面执行顺序 (HttpModule,HttpHandler)
- 一:理解ASP.NET的运行机制(例:通过HttpModule来计算页面执行时间)
- ASP.NET页面执行顺序 (HttpModule,HttpHandler)
- HTTPModule生命周期与页面执行模型
- HTTPModule生命周期与页面执行模型
- HTTPModule生命周期与页面执行模型
- HTTPModule生命周期与页面执行模型
- asp.net 通过httpModule计算页面的执行时间
- 一:理解ASP.NET的运行机制(例:通过HttpModule来计算页面执行时间)
- 一:理解ASP.NET的运行机制(例:通过HttpModule来计算页面执行时间)
- HTTPModule运行期与页面执行模型
- ASP.NET页面执行顺序 (HttpModule,HttpHandler)
- IHttpModule接口事件执行 获取Session 找了很多国内的都不对,从国外转过来一个测试可用的
- 一点一点学ASP.NET之基础概念——HTTP运行期与页面执行模型
- Android利用HttpURLConnection发送参数及获得页面内容