asax文件的功能

叩问照旧认知KT:

1 Global.asax文件的功用 

http://www.cnblogs.com/kingthy/archive/2011/08/08/2130973.html

先看看MSDN的解说,Global.asax 文件(也称为 ASP.NET
应用程序文件)是一个可选的文本,该文件包蕴响应 ASP.NET
或HTTP模块所引发的应用程序等第和对话等级事件的代码。Global.asax
文件驻留在 ASP.NET 应用程序的根目录中。运维时,剖判 Global.asax
并将其编写翻译到多个动态变化的 .NET Framework
类,该类是从HttpApplication基类派生的。配置 ASP.NET,以便自动拒相对Global.asax 文件的别样间接的 ULX570L
需要;外界用户无法下载或查看里面包车型地铁代码。Global.asax
文件是可选的。只在期待管理应用程序事件或会话事件时,才应创制它.

 

2 Global.asax文件的成立 

在等级次序中什么运用KT?

点击Web站点>>增加新建项>>全局应用程序类,就可以增加Global.asax文件。

KT是二个库,所以将KT的dll文件援用到您的品种上就能够使用KT里的函数功能。

3 Global.asax文件的执行 

 

诸如,IIS未来接受三个造访ASP.NET应用程序的央浼,那时候IIS会将那几个诉求映射给aspnet_isapi.dll,当aspnet_isapi.dll接到那几个乞请后,会新建一个aspnet_wp.exe的进度(windows
server
2002下是w3wp.exe进度),这么些进度会将呼吁传递给三个被钦命的AppDomain,当以此AppDomain被创立时,就能够去加载一些配备文件中的信息(加载顺序是从machine.config文件到web.config文件中的一些有关布置),而当那一个音信都被加载将来,AppDomain会去赢得一个HttpApplication的实例,那一年global类就能被编写翻译加载了,接下去AppDomain会做一些连锁的拍卖创设Page类的实例,最后这么些页面展现到客户端浏览器上。但这里有某个主题材料需求留心,当配置文件被加载的时候,并不是意味AppDomain会加载配置文件中具有的音信,而仅是加载一些急需的音信。而有个别配置音信是在必要时,才会被AppDomain加载。比如大家在web.config文件中安顿了许多HttpModule,可是仅当每一个HttpModule被访问到时,AppDomain才会去加载并拍卖那个新闻。所以说web.config文件和global未有先后实行的次第,只是视实际的音信何时会被加载和拍卖。

本节将介绍大家认知KTCurry的对象池和怎么样行使它们。KT里的对象池对象都存放在“KT.Core.ObjectPool“下,当你已在你的花色里引用了KT库后,则写下以下代码就足以使用到KT里的具备目标池了。

4 Global.asax.cs中的方法的含义 

using KT.Core.ObjectPool;

Application_Init:在每三个HttpApplication实例开首化的时候实行 

 

Application_Disposed:在每叁个HttpApplication实例被销毁从前实践 

先明白一下对象池 

Application_Error:全数未有管理的错误都会产生这些格局的实行 

对象池,看名称就能够想到其意义正是用来存款和储蓄对象的池(汗-_-!!),在它的生命周期内保安着它里面包车型大巴兼具目的,确定保证在同贰个生命周期内对象池里的数额的唯一性。当对象池被销毁时,它里面包车型大巴保有目的也将跟着销毁。

Application_Start:在程序开首化的时候实施。在Web应用程序的生命周期里就举行二遍,这里不得不放一些公用的音讯,比方HttpApplicationState。 

 

Application_End:应用程序结束时,在最后壹个HttpApplication销毁之后试行。对应Application_Start,在全路生命周期里面也是只进行二回。 

它的接口定义:

Session_Start:会话开端时实践。 

/// <summary>
/// 对象池接口
/// </summary>
public interface IObjectPool : IDisposable
{
    /// <summary>
    /// 添加对象,如果已存在key,则更新旧值
    /// </summary>
    /// <param name="key">键值</param>
    /// <param name="value"></param>
    void Add(object key, object value);

    /// <summary>
    /// 判断是否存在某个对象
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    bool Contains(object key);

    /// <summary>
    /// 移除某个对象
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    bool Remove(object key);

    /// <summary>
    /// 返回某个对象,如果不存在则返回null
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    object Get(object key);

    /// <summary>
    /// 返回对象池中已存储的对象数量
    /// </summary>
    int Count { get; }

    /// <summary>
    /// 清空对象池
    /// </summary>
    void Clear();
}

Session_End:会话结束或超时时举办。 

 

Application_BeginRequest:BeginRequest是在接收Request时首先个触发的事件,那么些办法第叁个实践。 

现阶段在KT里落成了此接口的共有几个指标,如下:

Application_AuthenticateRequest:当安全模块已经制造了最近用户的标志后实践。 

图片 1

Application_AuthorizeRequest:当安全模块已经证实了当前用户的授权时进行。 

 

Application_ResolveRequestCache:当ASP.NET实现授权事件以使缓存模块从缓存中为呼吁提供劳动时爆发,从而跳过管理程序(页面也许是WebService)的试行。那样做能够改进网址的属性,那些事件还足以用来推断正文是否从Cache中获得的。 

当中DictionaryObjectPool是应用Hashtable落成的对象池,用于向其它对象池提供基础服务。ObjectPoolBase则是一个抽象类,是其它对象池的基类。

Application_AcquireRequestState:当ASP.NET获取当前呼吁所涉及的当下场馆(如Session)时举办。 

 

Application_PreRequestHandlerExecute:当ASP.Net将在把央求发送各管理程序对象(页面大概是WebService)之前实践。今年,Session就足以用了。 

对象池的品类

Application_PostRequestHandlerExecute:当管理程序对象专门的工作变成后奉行。 

故事生命周期的例外,可分为不一致类其余对象池,KT近年来共有以下三种:

Application_ReleaseRequestState:在ASP.NET试行完全体恳求处理程序后实行。ReleaseRequestState事件将使当前情景数据被保留。 

 

Application_UpdateRequestCache:在ASP.NET推行完处理程序后为了继续的哀告而革新响应缓存时进行。 

A、WebApplicationObjectPool: 基于ASP.NET 应用程序的对象池

Application_EndRequest:同上,EndRequest是在响应Request时最终多个接触的风浪,这么些点子自然正是最后二个实行的了。 

    
对于同三个ASP.NET应用程序(同四个Web站点程序)来讲,对象池里的数量都以公私的,使用示例:

Application_PreSendRequestHeaders:向客户端发送Http标头之前实践。 

WebApplicationObjectPool.Instance.Add("数据", "数据值");
var value1 = WebApplicationObjectPool.Instance.Get("数据").As<string>();

//通过扩展方法获取数据
var value2 = WebApplicationObjectPool.Instance.GetOrAdd<string>("数据1", () => "数据值1");

Application_PreSendRequestContent:向客户端发送Http正文此前实践。 

 

Request相应的风浪施行各样: 

在意:假诺供给在ASP.NET应用程序结束时自动回收数据,请在Global.asax里的Application_End事件里丰硕回收代码,如下示例:

1.BeginRequest

protected void Application_End(object sender, EventArgs e)
{
    WebApplicationObjectPool.Instance.Dispose();
}

2.AuthenticateRequest

 

3.AuthorizeRequest

B、WebSessionObjectPool : 基于ASP.NET Session会话期的对象池

4.ResolveRequestCache

     对于同贰个Session会话来讲,对象池里的数额都以公共的,使用示例:

5.AcquireRequestState

WebSessionObjectPool.Instance.Add("数据", "数据值");
var value1 = WebSessionObjectPool.Instance.Get("数据").As<string>();

//通过扩展方法获取数据
var value2 = WebSessionObjectPool.Instance.GetOrAdd<string>("数据1", () => "数据值1");

6.PreRequestHandlerExecute

在意:固然急需在Session失效时自动回收数据,请在Global.asax里的Session_End事件里丰盛回收代码,如下示例:

7.PostRequestHandlerExecute

protected void Session_End(object sender, EventArgs e)
{
    WebSessionObjectPool.Instance.Dispose();
}

8.ReleaseRequestState

 

9.UpdateRequestCache

 

10.EndRequest 

C、WebRequestObjectPool : 基于ASP.NET Request央浼上下文的指标池

如上是在下的一对读书中的收获,以及一些猥琐的意见,分享给刚刚在那上面或有思疑的园友,同期也当作笔记!或有部分材料采撷于互联网,理解如有偏颇,请园友回复指正!拜谢!___
勤能补拙是良训,一分辛劳一分才。与各位共勉!

     对于同三个Http Web
Request会话来讲,对象池里的多少都以集体的,使用示例:

WebRequestObjectPool.Instance.Add("数据", "数据值");
var value1 = WebRequestObjectPool.Instance.Get("数据").As<string>();

//通过扩展方法获取数据
var value2 = WebRequestObjectPool.Instance.GetOrAdd<string>("数据1", () => "数据值1");

留意:要是急需在Http
Request达成时自动回收数据,请在web.config里登记WebRequestObjectPoolModule,如下示例:

        <httpModules>
            <add name="WebRequestObjectPoolModule" type="KT.Core.ObjectPool.WebRequestObjectPoolModule" />
        </httpModules>

 

 

D、ThreadCallObjectPool :
基于线程调用的对象池。此对象池能够在ASP.NET和Application情形下采用。

    对于同两个线程来讲,对象池里的数码是公私的。使用示例:

public class Program
{
    static void Main(string[] args)
    {
        for (var i = 0; i < 100; i++)
        {
            Thread th = new Thread(()=>{
                var name = ThreadCallObjectPool.Instance.GetOrAdd<string>("K", ()=>Thread.CurrentThread.Name);
                Console.WriteLine("Thread: {0}, K={1}", Thread.CurrentThread.Name, name);
                Thread.Sleep(10);
                Console.WriteLine("Thread: {0}, K={1}", Thread.CurrentThread.Name, ThreadCallObjectPool.Instance.Get("K"));
            });
            th.Name = i.ToString();
            th.Start();
        }
        Console.Read();
    }
}

 

采纳对象池上下文

KT里提供三个脚下上下文的指标池调用“ObjectPoolContext”,此指标会自动依据你所处的上下文意况,调用对应的靶子池实例。比如您眼下的顺序是运营在ASP.NET
Web遭逢下,则会调用WebRequestObjectPool而借使是在Application碰着下则会调用ThreadCallObjectPool对象池,如下示例代码:

/// <summary>
/// 商家模块
/// </summary>
public IMerchantsModule MerchantsModule
{
    get
    {
        return ObjectPoolContext.Current.GetOrAdd<IMerchantsModule>(
            typeof(MerchantsModule), () =>
            {
                return new MerchantsModule(this.DbHelper);
            });
    }
}
以上代码,不管是在ASP.NET环境还是在Application环境都可以正常运行。

相关文章