程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 無侵入方面編程-用HttpModule+SoapExtension監視頁面執行參數(一)

無侵入方面編程-用HttpModule+SoapExtension監視頁面執行參數(一)

編輯:關於ASP.NET

先簡單介紹一下項目吧,我們這個項目是用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");
}

}
}


}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved