HttpModule教程

在asp.net上下载的communityStarterKit,研究了很长时间都不知道它的页面是如何实现跳转的,而且它的超链接我根本找不到。最后进行断点跟踪,终于找到CommunitiesModule类,发现了其继承自IHttpModule,接着在项目中搜索CommunitiesModule,终于发现了webconfig.xml中有这么一段
<system.web>  
        <compilation debug="true" />
        <customErrors mode="Off"/>
        <httpModules>
            <add name="CommunitiesModule" type="ASPNET.StarterKit.Communities.CommunitiesModule,ASPNET.StarterKit.Communities" />
        </httpModules>
然后就是看帮助,上网搜,终于知道了。。。。

ASP.Net中自定义Http处理及应用之HttpModule篇
作者:孙亚民    
HttpHandler实现了类似于ISAPI Extention的功能,他处理请求(Request)的信息和发送响应(Response)。HttpHandler功能的实现通过实现IHttpHandler接口来达到。而HttpModule实现了类似于ISAPI Filter的功能。

HttpModule的实现


HttpModules实现了类似于ISAPI Filter的功能,在开发上,通常需要经过以下步骤:

1.编写一个类,实现IhttpModule接口

2.实现Init 方法,并且注册需要的方法

3.实现注册的方法

4.实现Dispose方法,如果需要手工为类做一些清除工作,可以添加Dispose方法的实现,但这不是必需的,通常可以不为Dispose方法添加任何代码。

5.在Web.config文件中,注册您编写的类

下面是一个HttpModules的示例,在这个示例中,只是简单的注册了HttpApplication 的BeginRequest 和 EndRequest事件,并且通过这些事件的实现方法,将相关的信息打印出来。

例1:
            using System;
            using System.Web;
            namespace MyModule
            {
            public class MyModule : IHttpModule
            {
            public void Init(HttpApplication application)
            {
            application.BeginRequest += (new
            EventHandler(this.Application_BeginRequest));
            application.EndRequest += (new
            EventHandler(this.Application_EndRequest));
            }
            private void Application_BeginRequest(Object source, EventArgs e)
            {
            HttpApplication Application = (HttpApplication)source;
            HttpResponse Response=Application.Context.Response;
            Response.Write("<h1>Beginning of Request</h1><hr>");
            }
            private void Application_EndRequest(Object source, EventArgs e)
            {
            HttpApplication application = (HttpApplication)source;
            HttpResponse Response=Application.Context.Response;
            Response.Write("<h1>End of Request</h1><hr>");
            }
            public void Dispose()
            {
            }
            }
            }


程序的开始引用了如下名称空间:

using System;
            using System.Web;


因为HttpApplication、HttpContext、HttpResponse等类在System.Web中定义,因此,System.Web名称空间是必须引用的。

MyModule类实现了IhttpModule接口。在Init方法中,指明了实现BeginRequest 和EndRequest 事件的方法。在这两个方法中,只是简单的分别打印了一些信息。

下面,在Web.config文件中注册这个类,就可以使用这个HttpModule了,注册的方法如下:

<configuration>
            <system.web>
            <httpModules>
            <add name=" MyModule " type=" MyModule, MyModule" />
            </httpModules>
            </system.web>
            </configuration>


现在来看一下效果。编写一个Aspx页面test.aspx,内容如下:

<%
            Response.Write("<h1>This is the Page</h1><hr>");
            %>


运行以后的界面如图所示:



深入研究HttpModule


HttpModule通过对HttpApplication对象的一系列事件的处理来对HTTP处理管道施加影响,这些事件在HttpModule的Init方法中进行注册,包括:

BeginRequest
            AuthenticateRequest
            AuthorizeRequest
            ResolveRequestCache
            AcquireRequestState
            PreRequestHandlerExecute
            PostRequestHandlerExecute
            ReleaseRequestState
            UpdateRequestCache
            EndRequest


其中部分事件同Global.asax中的事件相对应,对应关系如下:

HttpModule Global.asax
BeginRequest Application_BeginRequest
AuthenticateRequest Application_AuthenticateRequest
EndRequest Application_EndRequest


在例1中,处理了BeginRequest和EndRequest事件,其他事件的处理方式基本上类似。

同HttpHandler对应来看,这些事件,有些在HttpHandler之前发生,有些在HttpHandler处理完后发生。了解事件发生的顺序非常重要,因为,服务器端的对象在不同的时间段有着不同的表现。例子之一是Session的使用。不是所有的事件中都能对Session进行处理,而只能在有限的几个事件中进行处理。详细的过程可以参考下面的HTTP Request处理生命周期图。



使用HttpModule实现权限系统


我们在开发应用系统的时候,应用系统的权限控制是非常重要的一个部分。在ASP中,要实现权限的控制是比较麻烦的事情,因为我们必须在每个需要控制权限的ASP页面中添加权限控制代码,从而控制客户对页面的访问。这样带来的问题,除了编写大量重复代?/span>
posted @ 2008-06-24 17:22 一想天开 阅读(26) | 评论 (0)编辑
在这个越来越以技术为中心的世界里,职位的进阶需要什么?带着这个问题,我们采访了一些CEO、CIO、老板和猎头。以下就是特别为您总结的10条创造和利用职业机会的规则。
  保险集团Chubb公司的CIO June Drewry说:“企业中没有‘IT项目’,只有具有IT组成部分的业务项目。”IT员工中介公司Sapphire Technologies应用开发高级经理Ray Howell说,取得职业成功最重要的规则是:如果想沿企业职务阶梯上升,就必须首先像业务人员那样思考,然后再像技术人员那样思考。
  Howell说:“技术人员必须从业务角度审视IT项目。在讨论技术项目的会议上,能够设身处地为财务和销售人员着想,从他们的角度看问题,这会更快速地找到解决办法。
  一种做更多工作的办法是自愿承担计划外的项目,然后出色地完成它们。Sunil Misra说,他的第一次重大突破出现在自愿在加班时间内负责测试公司文档管理/CAD软件。Misra说:“这让我被高管层注意到,还让我接触到了完全不同的一群人,就是最终用户测试员。在我当时的职位上,是没有机会与他们接触的。此后,我被要求承担公司下一个产品套件的项目管理工作。” Misra现在是阿姆斯特丹信息与通信技术公司Getronics的咨询服务副总裁。
  承担大量的新项目,最终可能有某个项目完全被弄砸了。宽幅图像设备经销商Charette公司的CEO Jack Ford说,在发生这种事时,您必须承担责任而不是互相推诿。Ford说:“我需要的是不仅愿意承担项目,而且还愿意在失败时勇于承担责任的人。在IT界,如果项目没有成功或没有按期完成,很容易解释成因为经营人员、销售人员或外部供应商不合作。但是最好说:‘我知道项目没有完成,但是我们在哪里跌倒就从哪里爬起来’。”
  老板们总是提升有领导能力的人。Mark Stevens说,领导能力的一个重要方面就是坚持己见,并知道如何表达它们,无论自己的看法触犯了什么人。Stevens是全球营销公司MSCO公司的CEO。Stevens说:“许多人害怕,如果他们表达了自己的真实看法,就会受到压制,但大多数情况下,情况正好相反。通过坚持原则,不怕得罪人,激励人们跟着您继续干下去。要敢为天下先。”
  MSCO的 Stevens说,如果您可以在一个对于公司的未来至关重要的项目中成为关键先生,那这就是可以让您取得成功的“杀手应用”了。Stevens建议:“找到一件对您的公司十分重要的事情,并成为处理这件事的最佳人选。”
  这里有一个隐藏的危险。如果您的专业知识给人留下过于技术化的印象,您所做的一切只是加强了人们您是个技术怪才的印象。不过,技术怪才也有生存空间,它应该适用于对于您的公司业务战略至关重要的东西。
  您的技术等级可以让您高人一筹,但前提是它们不会落伍。不要放过任何涉及新兴技术(例如SOA、协作应用或数据仓库)的培训机会。职业中介公司KForce的技术人员副总裁David Bair说:“您必须保持领先。过时的技能会成为技术职业生涯道路上最致命的缺陷之一。”如果您的公司不提供先进技术的培训,那就自己花钱去学习。Bair说:“如果现在花2000元参加培训,就意味着未来工资会增加20000元,这就是非常好的投资回报。”
  教育不该止步于技术技能。商业课程和专业证书可能在远期带来更为丰厚的回报。Sierra Club公司IT经理Dave Simon说,帮助推动他职业发展的因素之一是成为注册会计师(CPA)。而他是在老板的鼓励下才获得这个证书的。Simon说:“获得CPA证书带来了丰厚的收益,它给了我商业知识和更多直线管理(line management)的可信度。我不再只被视为技术人员。” Sapphire公司的Howell说,他目前自掏腰包参加Worcester综合技术学院举办的高科技MBA学习。Howell说:“我不断努力鞭策自己,使自己全面发展。”
 到了考核绩效的时候,很多IT专业人员发现自己无话可讲。KForce的Bair说:“我们常常发现技术专家身上最缺乏的一样东西是交流他们为公司取得成功的能力。”怎样解决这个问题?方法是建立记录您所取成就的书面档案,以后在合适的时候可以将该档案交给您的上司。这个档案可以像您附在简历上的成绩清单那样正规,也可以像手写的笔记那样简单。
 纽约Christian & Timber公司CIO招聘项目的负责人Groce说,技术人员常常不愿意引进新的人才,害怕他们以后会去竞争顶级职位。有更好的策略吗?答案是,“指导和培养可以接替您职位的人”,让您可以晋升到更高的级别。Groce补充说:“技术领导人在这方面的能力比较差。他们害怕培养下一代领导人可能会让别人在晋升名单上超过自己。”KForce的Bair说,雇用优秀人才将为您在高管层那里挣得更多的分数。最终,您将赢得伯乐的名声,从而让您变得更加不可或缺。  Chubb公司的Drewry说,从长远的角度看,讨好上司并不可行。“这种讨好迟早会让上司感到讨厌,尤其他们一旦注意到从这位员工那里得到的只是讨好,而没有其他任何东西的时候。”另一方面,Drewry强调向上管理(managing up)的重要性。“这意味着了解上司所想、他的优势与弱点、他感兴趣的东西,然后教育他了解您可以为实现企业目标做些什么。”
 拥有20亿美元资产的招聘与员工中介公司Spherion高级副总裁Brendan Courtney说,内部政治始终影响到谁将得到升迁,假装超脱并不是一种有效的策略。外包咨询机构EquaTerra公司的客户经理David Zink说,到了紧要关头,一定要拿出自己勇气。Zink说:“我坚持一个原则:就是做正确的事情,不去做在政治上显得正确的事情。面对您的同事甚至上司需要勇气,但这让您更容易看清自己。”
posted @ 2008-05-23 14:04 一想天开 阅读(27) | 评论 (0)编辑
    10亿个数中找出1000个最大的数的算法思路:

   1,先拿出前1000个数字,并排序,找出最小值为 minValue .
   2,  然后再依次拿出1000个数字,找出最大值为 tempMaxValue.
   3,  如果tempMaxValue 比 minValue 大, 则将 theMaxValue 放入前1000个数中,再排序并找出minValue .
   4 .. 依此类推。 即可得到1000个最大的数。 


   以下是本人测试的代码 。可以参考,欢迎高手指正,谢谢!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace test
{
    public class Class1
    {
        private  const int MaxLength = 100000000;
        private const int EachCount = 1000;

        public static void TestDirectSort()
        {
            Console.WriteLine(" test start :" + DateTime.Now.ToLongTimeString());

            int[] orignList = new int[MaxLength];

            Random rd = new Random();
            for (int i = 0; i < MaxLength; i++)
            {
                orignList[i] = rd.Next();
            }

            ArrayList list = new ArrayList(MaxLength);
            list.AddRange(orignList);
            list.Sort();

            int[] retList = new int[1000];
            int j = 0;
            for (int i = MaxLength - 1; i > MaxLength - 1000; i++)
            {
                retList[j] = orignList[i];
                j++;
            }

            Console.WriteLine(" test end : " + DateTime.Now.ToLongTimeString());

            foreach (int i in list)
            {
                Console.WriteLine(i.ToString());
            }
            Console.WriteLine("end: " + DateTime.Now.ToLongTimeString());

        }

        public static void TestSort()
        {
            Console.WriteLine(" test start :"  + DateTime.Now.ToLongTimeString());

            int[] orignList = new int[MaxLength] ;
           
            Random rd = new Random();
            for (int i = 0; i < MaxLength; i++)
            {
                orignList[i] = rd.Next();
            }

            ArrayList foreList = new ArrayList();
            if (MaxLength > EachCount)
            {
                for (int i = 0; i < EachCount; i++)
                {
                    foreList.Add(orignList[i]);
                }

                foreList.Sort();
                int addValue = EachCount;
                for (int j = 1; j < MaxLength / EachCount +1 ; j++)
                {
                    ArrayList tempList = new ArrayList();
                    for (int k = j * addValue; k < j * addValue + EachCount; k++)
                    {
                        if (k >= MaxLength) break;
                        //tempList[k - j * addValue] = orignList[k];
                        tempList.Add(orignList[k]);
                    }

                    tempList.Sort();
                    for (int m = tempList.Count -1; m >=0 ; m--)
                    {
                        if ((int)tempList[m] <= (int)foreList[0])
                            break;
                       
                        foreList[0] = tempList[m];
                        foreList.Sort();
                    }
                }
            }
            else
            {
                foreList.AddRange(orignList);
                foreList.Sort();
            }

            Console.WriteLine(" test end : " + DateTime.Now.ToLongTimeString());

            foreach (int i in foreList)
            {
                Console.WriteLine(i.ToString());
            }
            Console.WriteLine("end: " + DateTime.Now.ToLongTimeString());
        }
    }

    public class client
    {
        public static void Main()
        {
            Class1.TestSort();

           // Class1.TestDirectSort();

            Console.Read();

        }
    }
}

posted @ 2008-05-18 18:52 一想天开 阅读(70) | 评论 (2)编辑
     摘要: 很多时候会用到AES加密。下面是加密解密方法:/// <summary>/// AES加密字符串/// </summary>/// <param name="encryptString">待加密的字符串</param>/// <param name="keySize">密钥类型(密钥位数)<see cref="Aes.KeySize... 阅读全文
posted @ 2008-04-17 17:35 一想天开 阅读(101) | 评论 (0)编辑
  现在的项目基于soa架构,数据库也将使用oracle 11g.下面简要介绍一下oracle 11g安装步骤。 
1,解压ODTwithODAC1110620.zip 后直接安装。
2,解压ODAC1110621Xcopy.zip 后,开始-运行-cmd,然后切到解压目录,执行insall.bat.
3,进入pl/sql developer 中,在tool - 选项中选择 oracle 10g home . ok!
        
posted @ 2008-04-17 16:56 一想天开 阅读(135) | 评论 (0)编辑
今天是2007年12月2日,新购买了个ThinkPad T60,留个纪念!呵呵。

cpu: T2400 1.83G双核
内存:1G
硬盘:80G

目前xp系统速度还不错,不知道跑vista 怎么样,改天装个vista 感觉一下。
posted @ 2007-12-02 21:50 一想天开 阅读(14) | 评论 (1)编辑
说明:
1.ListBox为服务器端控件,list可以在服务器端初始化
2.Button可以为服务器端,也可以为客户端控件:
如果为服务器端控件,需要在页面初始化的时候为其添加事件处理为: 


btn_updaddrel.Attributes.Add("OnClick","javascript:add();");
如果为客户端控件,则在声明控件的时候指定事件处理:

<INPUT type="button" value="ADD" onclick = "add()">

3.事件处理 

<script language="Javascript">
function add()

var objres = document.getElementById("lb_updrestitems");
var objsel = document.getElementById("lb_updselitems");

var customOptions;
for(var i = objres.options.length - 1 ;i >= 0;i--)
{
if(objres.options.selected)
{
customOptions = document.createElement("OPTION");
customOptions.text = objres.options.text;
customOptions.value = objres.options.value;
objsel.add(customOptions,0);
objres.remove(i); 
}
}
return false; 
}
</script> 
posted @ 2007-12-01 09:22 一想天开 阅读(36) | 评论 (1)编辑
     摘要: 两个ListBox的互动方法 效果: ASPX页面: <table> <tbody> <tr> <td> <asp:ListBoxID="lbLeft"runat="server"SelectionMode="Multiple"> <asp:ListItem>添加名字</asp:ListItem> <asp:... 阅读全文
posted @ 2007-12-01 09:04 一想天开 阅读(98) | 评论 (0)编辑
    该文被密码保护。
posted @ 2007-11-15 09:51 一想天开 阅读(6) | 评论 (0)编辑
http://www.port80software.com/support/p80tools
posted @ 2007-10-22 13:39 一想天开 阅读(29) | 评论 (0)编辑