国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - Mvc動態注冊HttpModule詳解

Mvc動態注冊HttpModule詳解

2020-04-24 14:10張龍豪 ASP.NET教程

本文主要介紹了Mvc動態注冊HttpModule的方法。具有很好的參考價值,下面跟著小編一起來看下吧

序言

注冊Httpmodule可以讓我們使用HttpApplication對象中的處理管道事件。目前大家所熟知的應該有2種方式來使用HttpApplication對象中的處理管道事件。第一種是通過Global.asax全局文件,另外一種是通過配置文件來注冊httpmodule。那么有這2種方式啦,為什么還要有今天這篇博客呢?

這里我也提1個簡單的問題,用實例來證明下動態注冊httpmodule的可取之處。

如果你要寫一個.net框架,供公司所有mvc項目使用,那么你的框架集成的眾多功能中,至少應該需要一個異常記錄的功能吧,有啦這個功能之后,別人的項目即便忘記處理異常信息,那么框架也會幫忙一個不拉的將項目異常信息寫入框架的日志當中,還有你的框架要叼,怎么叼呢?叼到別人不需要寫如一行代碼即可實現這樣的功能,哇咔,怎么實現?在你的框架中,只需要幾行代碼即可。

Microsoft.Web.Infrastructure.dll與PreApplicationStartMethodAttribute屬性

首先我們利用ilspy來看下Microsoft.Web.Infrastructure.dll這個類庫是干什么的,如圖:

Mvc動態注冊HttpModule詳解

?
1
2
3
4
5
6
7
8
9
[SecuritySafeCritical]
public static void RegisterModule(Type moduleType)
{
  if (DynamicModuleReflectionUtil.Fx45RegisterModuleDelegate != null)
  {
DynamicModuleReflectionUtil.Fx45RegisterModuleDelegate(moduleType);
    return;
  }DynamicModuleUtility.LegacyModuleRegistrar.RegisterModule(moduleType);
}

那看到此類庫的源碼之后,便可以順藤摸瓜,看清其真面目啦。

  1. Microsoft.Web.Infrastructure.DynamicModuleHelper 此命名空間我們可以看出他是關于動態module的helper 。
  2. DynamicModuleUtility此類便是實用類,那么打開之后,便看到啦一個醒目的方法,RegisterModule,注冊Module,沒錯他就是動態注冊HttoModule的方法。

思考一下上面我的命題,是在項目中一行代碼不用便可執行我們的類庫,那么動態注冊HttpModule有啦,接下來就是怎么一行代碼不寫,就能運行我們的類庫呢?這就用到啦微軟提供的PreApplicationStartMethodAttribute 屬性。

  1. PreApplicationStartMethodAttribute:此屬性也可以望文生義,便是在application啟動之前要運行的方法。就是說他也是一個程序的入口點,并且還是application初始化之前便啟動啦,萬物之初先有的便是它,造作吧。
  2. WebActivatorEx:這是一個類庫,微軟提供啦PreApplicationStartMethodAttribute特性,微軟Nuget開發小組有一個成員David Ebbo寫啦這個更叼的類庫,內容如下圖

Mvc動態注冊HttpModule詳解

呢,這個類庫可以動態注冊HttpMoudle,他還實現不修改全局文件就可以加入,Application_Start()/Shutdown()事件,源碼你可以使用ilspy查看,也有項目的git地址,通過nuget可以獲取,值得你去研究下。

Mvc動態注冊HttpModule詳解

代碼實現動態注冊HttpMoudle

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(RoutingCore.PreApplicationStartRegist), "PreStart")]
namespace RoutingCore
{
  public class PreApplicationStartRegist
  {
    private static bool hasLoaded;
    public static void PreStart()
    {
      if (!hasLoaded)
      {
        hasLoaded = true;
        DynamicModuleUtility.RegisterModule(typeof(RoutingModule));
      }
    }
  }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class RoutingModule : IHttpModule
  {
    public void Init(HttpApplication context)
    {
      context.BeginRequest += new EventHandler(context_BeginRequest);
      context.Error += new EventHandler(context_ErrorRequest);
    }
    void context_BeginRequest(object sender, EventArgs e)
    {
    }
    void context_ErrorRequest(object sender, EventArgs e)
    {
      HttpApplication ap = sender as HttpApplication;
      var error = ap.Server.GetLastError();
      var code = (error is HttpException) ? (error as HttpException).GetHttpCode() : 500;
      if (code != 404)
      {
      }
      // 寫入本地文件,隊列或數據庫
      // ...         
      ap.Server.ClearError();
      ap.Response.Write(error.Message);
      ap.Response.End();
    }
    public void Dispose() { }
  }

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持服務器之家!

原文鏈接:http://www.cnblogs.com/knowledgesea/p/6232617.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品久久久久永久免费观看 | 精品久久久久久亚洲精品 | 久久久久久毛片免费看 | 久久免费99精品久久久久久 | 日韩特一级 | 久久艹综合 | av在线电影网 | 中文字幕精品一区二区精品 | 亚洲一区二区三区蜜桃 | 精品欧美 | 久久久成人动漫 | 精品久久久久久 | 久久综合国产 | 欧美成人a∨高清免费观看 国产99久久 | 免费国产视频 | 国产成人jvid在线播放 | 欧美日韩免费一区二区三区 | 精品成人一区二区三区 | 国产午夜精品久久久 | 欧美国产精品一区 | 91国自产精品中文字幕亚洲 | 好看的一级毛片 | 日批免费观看视频 | a免费视频 | 日韩精品久久久久久 | 国产一级片播放 | 黄网在线观看 | 最新中文字幕 | 亚洲精品视频在线 | 羞羞的视频在线 | 亚洲视频一区在线观看 | 毛片免费观看视频 | 黄色片小视频 | 综合伊人 | av网站免费在线观看 | 久久精品中文字幕大胸 | 日韩成人中文字幕 | 伊人99| 中文字幕在线精品 | 精品国产不卡一区二区三区 | 久久福利 |