首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

無侵入 AOP:HttpModule + SoapExtension 監控頁面執行參數(一)

     編輯:關於ASP.NET

專案架構:Web 前端 + WebService 業務層 + 資料庫,三層分佈式部署。需求:統計每頁執行時間、WebService 呼叫方法與耗時。採用 HttpModule + SoapExtension 雙重攔截,零侵入業務代碼。

Web.config 註冊

<httpModules>
  <add name="WSInvokeMonitorHttpModule" type="Hebmc.WebTools.WSInvokeMonitor.WSInvokeMonitorHttpModule, WSInvokeMonitor" />
</httpModules>
<webServices>
  <soapExtensionTypes>
    <add type="Hebmc.WebTools.WSInvokeMonitor.SimpleWSInvokeMonitorExtension, WSInvokeMonitor" priority="1" group="0" />
  </soapExtensionTypes>
</webServices>

SimpleWSInvokeMonitorExtension 實作

public class SimpleWSInvokeMonitorExtension : SoapExtension {
  private const string WSInvokeMonitorKey = "__WSInvokeMonitorKey__";
  private WSInvokeInfo invokeInfo = new WSInvokeInfo();
  public override Stream ChainStream(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:
          invokeInfo.BeginInvokeTime = DateTime.Now;
          invokeInfo.MethodName = message.MethodInfo.Name; break;
        case SoapMessageStage.AfterDeserialize:
          invokeInfo.EndInvokeTime = DateTime.Now;
          var pageInfo = (PageInfo)HttpContext.Current.Items[WSInvokeMonitorKey];
          if (pageInfo != null) pageInfo.AppendInvokeInfo(invokeInfo); break;
      }
    } else if (message is SoapServerMessage) { /* 伺服端略 */ }
  }
}

HttpModule 收集點

於 BeginRequest、PreRequestHandlerExecute、PreSendRequestContent、EndRequest 等事件收集頁面層級資訊,最後由 Log4Net 寫入日誌。達成開關配置即啟用/停用,無需重新編譯部署。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved