cs中的方法的意思

询问照旧认识KT:

跟 Request 有关的放到前边一起说,先说其余的 5 个。

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

Application_Init :在每一种 HttpApplication 实例伊始化的时候实施。

 

Application_Disposed :在每个 HttpApplication 实例被灭绝以前实施。

在品种中什么运用KT?

Application_Error :所有没有处理的错误都会招致这几个法子的推行。

KT是一个库,所以将KT的dll文件引用到您的类型上即可使用KT里的函数效能。

Application_Start :在程序起初化的时候实施。在 Web
应用程序的生命周期里就实施五回(自动的再一次开动算此外四遍生命周期),那里只可以放一些公用的新闻,比如
HttpApplicationState 。

 

Application_End :应用程序为止时,在结尾一个 HttpApplication
销毁之后执行。对应 Application_Start
,在全路生命周期里面也是只进行一遍。

本节将介绍大家认识KT库里的对象池和怎样行使它们。KT里的对象池对象都存放在“KT.Core.ObjectPool“下,当你已在你的品种里引用了KT库后,则写下以下代码就足以选取到KT里的有所指标池了。

上边来看看跟 Request 有关的,首先我们来探望相应的事件实施各样:

using KT.Core.ObjectPool;

1.       BeginRequest

 

2.       AuthenticateRequest

先通晓一下对象池 

3.       AuthorizeRequest

对象池,顾名思义就是用来存储对象的池(汗-_-!!),在它的生命周期内保障着它里面的有着目标,确保在同一个生命周期内对象池里的数量的唯一性。当对象池被销毁时,它其中的拥有目的也将随即销毁。

4.       ResolveRequestCache

 

5.       AcquireRequestState

它的接口定义:

6.       PreRequestHandlerExecute

/// <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();
}

7.       PostRequestHandlerExecute

 

8.       ReleaseRequestState

目前在KT里落成了此接口的共有三个目的,如下:

9.       UpdateRequestCache

图片 1

10.   EndRequest

 

其余还有多个:

里头DictionaryObjectPool是运用Hashtable完成的对象池,用于向别的对象池提供基础服务。ObjectPoolBase则是一个抽象类,是其余对象池的基类。

1.       PreSendRequestHeaders

 

2.       PreSendRequestContent

对象池的品类

那多少个事件的一一是无法确定的,依照 MSDN
的传道,它们随时都大概爆发。上边就按那个顺序来解释一下它们在
Global.asax.cs 中相应的事件处理方法的含义。

据悉生命周期的两样,可分为不相同类型的对象池,KT如今共有以下二种:

Application_BeginRequest : BeginRequest 是在接到 Request
时首先个触发的风云,这一个方法自然就是率先个实施的了。

 

Application_AuthenticateRequest
:当安全模块已经创设了当前用户的标识后实施。

A、WebApplicationObjectPool: 基于ASP.NET 应用程序的目标池

Application_AuthorizeRequest
:当安全模块已经证实了眼下用户的授权时实施。

    
对于同一个ASP.NET应用程序(同一个Web站点程序)来说,对象池里的数量都以共用的,使用示例:

Application_ResolveRequestCache :当 ASP.NET
落成授权事件以使缓存模块从缓存中为呼吁提供劳务时发出,从而跳过处理程序(
页面大概是 WebService)的进行。那样做可以改良网站的本性,那一个事件还是能用来判断正文是或不是从
Cache 中拿到的。

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

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

Application_AcquireRequestState :当 ASP.NET
获取当前恳请所涉嫌的日前景色(如 Session )时举办(真是拗口啊, msdn
上就那样写的,我本人想不出什么好句子了)。

 

Application_PreRequestHandlerExecute :当 ASP.Net
即将把请求发送处处理程序对象(页面只怕是 WebService)此前实施。那个时候, Session 就足以用了。

专注:尽管须要在ASP.NET应用程序截止时自动回收数据,请在Global.asax里的Application_End事件里丰裕回收代码,如下示例:

Application_PostRequestHandlerExecute : 当处理程序对象(页面或然是
WebService )工作成功之后执行。

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

Application_ReleaseRequestState :在 ASP.NET
执行完所有请求处理程序后执行。 ReleaseRequestState
事件将使当前事态数据被保留。

 

Application_UpdateRequestCache :在 ASP.NET
执行完处理程序后,为了持续的伸手而创新响应缓存时实施。

B、WebSessionObjectPool : 基于ASP.NET Session会话期的靶子池

Application_EndRequest :同上, EndRequest 是在响应 Request
时最终一个触及的事件,这些点子自然就是最后一个实施的了。

     对于同一个Session会话来说,对象池里的数目都以集体的,使用示例:

再说那四个无顺序的

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

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

Application_PreSendRequestHeaders :向客户端发送 Http 标头此前实施。

专注:如若急需在Session失效时自动回收数据,请在Global.asax里的Session_End事件里充裕回收代码,如下示例:

Application_PreSendRequestContent :向客户端发送 Http 正文从前实施。

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

 

 

最终就是三个有关 Session 的,那就几乎咯

 

Session_Start :会话开端时实施。

C、WebRequestObjectPool : 基于ASP.NET Request请求上下文的目的池

Session_End :会话截至或过期时举行。

     对于同一个Http Web
Request会话来说,对象池里的数据都以公私的,使用示例:

事实上 Global.asax.cs 中不只好放这几个,其他的落成了 IHttpModule
接口的类所揭披露来的轩然大波都足以应用那样的法门放置那里来。前提是在
Global.asax (或 Web.Config )中有照应的扬言。此外, Global.asax
中还足以有无数的花头,不过小编尚未整理,其实也很简单(更首要的是成百上千时候不咋用得上),
MSDN 里面有详尽的牵线,大家可以查一下,小编觉着最管用的就数极度 object
标记了, ^_^

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环境都可以正常运行。

相关文章