Asp.Net Unleashed 2nd Edition 学习笔记 第四部分

Part IV: Working with ASP.NET Applications
CHAPTER 15 Creating ASP.NET Applications
    15.1 Overview of ASP.NET Applications
        如何配置IIS,以便创建一个新的虚拟目录,不多说了,看看IIS的帮助,动手做一下,就都明白了
        同一个Application下面所有的Page都运行在一个AppDomain中,所有的AppDomain都是在AspNet_Wp.exe进程中,把AspNet_wp进程分隔成许多个AppDomain的优点在于
            一个Application中的代码不能够直接访问另一个Application的资源,因为跨AppDomain的访问要受到限制
            如果一个Application crash了,不影响其他的Application的运行
            一个AppDomain中的Assembly不和其他的AppDomain中的Assembly共享
            可以设定Application级别的安全策略
            可以为一个Application进行设置,而不影响其他的Application
        Application可以包含有Global.asax,用于处理Application级别的事件以及Application级别共享的对象,Global.asax要放在虚拟目录的根目录下
        Web.config文件,如果放在根目录下,是对整个的Application进行设置,如果放在某一个子目录下,那么子目录下的设置要遵从web.config文件中的设置
    15.2 Using Application State
        可以在Application状态中存储变量以及对象,这些存储在Application中的东东就像全局变量一样,在Application级别都可以访问
        Application State是HttpApplicationState类的实例
        创建一个Application State很简单,例如
            Application["MyDataSet"] = ds;
        删除一个Application State也很简单,例如
            Application.Remove("MyDataSet"); //删除一个
            Application.RemoveAll();  //删除全部
        Understanding Application State and Synchronization
            因为Application State存储的变量是Application级别可见的,那么在并发的状态下,可能会出现冲突而造成错误,为了解决这个问题,可以使用Application.Lock()方法和Appilcation.UnLock()来完成Application State的变量的锁定/解锁工作,从而保证一次只会有一个线程访问Lock中的变量
            使用Lock的时候,只能有一个现成访问Application State,其他的线程不能够访问,这样会造成性能瓶颈,解决办法是使用线程安全的对象,例如ArrayList或者HashTable来存储一些Appication State变量
        Using the Global.asax File
            Global.asax存储在虚拟目录的根目录下,用于处理Application级别的事件以及声明Application级别的对象
            Application支持一系列的事件,如下,
                Application_AuthenticateRequest,在对用户进行验证之前被触发
                Application_AuthorizeRequest,在对用户授权之前被触发
                Application_BeginRequest,每个到服务器的请求会触发
                Application_End,在Application实例终止的时候
                Application_EndRequest,在每个请求完成的时候
                Application_Error,没有被处理的错误触发
                Application_PreSendRequestContent,在给浏览器发送内容之前
                Application_PreSendRequestHeaders,在给浏览器发送Header之前
                Application_Start,第一个应用程序被创建的时候
                Dispose,在单独一个Application结束的时候触发
                Init,在Application实例被创建之后
            Understanding Context and Using the Global.asax File
                在一个Asp.Net的页面中,Page对象是默认存在的
                但是在Global.asax中,Page对象不是默认存在的。可以替代的,在Global.asax中,使用了Context对象的方法可以替代Page对象的方法
            Handling the Application Start and Init Events
                Application_Start事件在application的生命周期中,只会执行一次。可以在Application_Start事件中初始化在Application生命周期需要的变量
                Asp.Net框架使用了池化技术,池中存放了Application的实例,当有请求到来的时候,一个Application的实例被分配给请求,这个时候要出发Application的Init事件。可以在Init事件中,初始化Application的实例的生命周期中的变量
            Handling the Application_BeginRequest Event
                在请求要被处理时,Application_BeginRequest被触发。
    15.3 Using the Web.Config File
        Asp.Net使用了层级式的配置系统
            顶级的是Machine.Config文件
            在站点的虚拟目录下有web.config文件,配置整个站点
            在站点的子目录中可以由web.config文件,配置这个目录以及子目录下的内容
            下层的web.config文件配置会覆盖上层的web.config文件的配置
        Examining the Configuration Sections
            web.config文件包含了很多的部分(section),具体有,
                trace,是否可以跟踪
                globalization,对于request和response,使用的字符串编码格式
                httpRunTime,定义了超时时间,请求量的最大数字以及在进行客户重定向的时候是否使用完整URL
                compilation,包含了编译页面的配置信息。可以定义默认的编译语言。定义是否需要编译成debug模式
                pages,定义了asp.net页面的信息,例如使用这个section可以禁止请求验证、页面缓冲、会话状态或者视图状态
                customErrors,定义了错误信息应该如何显示
                authentication,定义了认证用户所需要的信息
                identity,配置用户帐号信息
                authorization,定义了对用户的授权方式
                machineKey,在一个Web farm上的共享的一个标准加密值
                trust,用于设定安全策略
                securityPolicy,包含了一组可用的安全策略
                sessionState,对会话状态的配置信息
                httpHandlers,联系了一个特定的http handler和特定的页面路径以及请求动词
                httpModules,列出了包含在每一个页面请求中的模块
                processModel,定义了IIS上的处理模式
                webControls,定义了和web control一同使用的客户端脚本库的位置
                clientTarget,列出了和ClientTarget属性一起使用的值
                browerCaps,可以使用的浏览器的兼容性
                webServices,对web service的配置信息
        Modifying Configuration Settings
            改就是了
        Setting the Configuration Location
            通过在web.config中使用location section进行配置,可以对某一个子目录甚至某一个文件进行特殊的设置
        Adding Custom Configuration Information
            通过在web.cinfig中增加appSettings section,可以拥有开发员自己的应用程序配置信息。读取appSettings下面的内容,使用ConfigSettings类就可以
    15.4 Using HTTP Handlers and Modules
        Working with HTTP Handlers
            HTTP handler允许开发员处理对于具有特定后缀、路径或者请求类型的文件的请求。
            典型的HTTP handler应用包括对于子定义认证体系或者子定义过滤器的实现
            所有到达ASP.Net站点的请求都需要HTTP handler进行处理。默认的情况下,.aspx后缀的文件使用PageHandlerFactory类进行处理,PageHandlerFactory类产生了PageHandler类的实例处理到达的请求
            创建自定义的HTTP Handler,需要完成以下步骤,
                创建一个类,这个类实现了IHttPHandler接口,实现IHttpHandler.ProcessRequest()方法以及IHttpHandler.IsReusable()方法
                在web.config文件中,加入对自定义handler引用
                在IIS上,进行配置
        Working with HTTP Modules
            HTTP module在访问底层的HTTP请求和相应的时候很类似,除此之外,HTTP module还可以参与每一个请求的处理
            Asp.Net框架中就有几个HTTP module完成了对状态和认证机制的处理
            创建自定义HTTP module,需要完成以下步骤,
                创建一个类,这个类实现了IHttpModule接口
                在web.config文件中,加入对自定义module的引用
        Creating the WhosOn Application
        Creating the WhosOn Web.Config File
        Creating the WhosOn Module
        Creating the WhosOn Handler
            这四个Creating讲了一个例子,如何使用HTTP Handler和HTTP module处理一个自定义的后缀名文件的请求处理

CHAPTER 16 Tracking User Sessions
    16.1 Using Browser Cookies
        Cookies是服务器存储在浏览器中的一些小片段的信息,不可以大于4k。分为两类
            session cookie是临时性的,只是存在于浏览器的内存中
            persistent cookie是持久化的,可以经年累月的存在。浏览器支持cookie维护一个或者多个特殊的文件,这些文件被称为cookie file
        How Cookies Work
            Cookie通过HTTP协议头,在浏览器和服务器之间传递。服务器在响应中使用SetCookie头来首先创建一个cookie,后续的从浏览器发送的请求将会返回这个cookie头
        Creating and Reading Session Cookies
            使用Response.Cookies["UserName"]/Reqeust.Cookies["UserName"]可以创建/访问cookie,例如
                HttpCookie myCookie = new HttpCookie("myCookie", "Hello");  //创建了一个HttpCookie的实例
                Response.Cookies.Add(myCookie); //把HttpCookie实例加入到浏览器的内存中
            读取Cookie,例如
                Request.Cookies["myCookie"].Value; //读取请求中的Cookie值
        Creating and Reading Persistent Cookies
            persistent cookie和session cookie类似,只不过persistent cookie有一个明确的过期日期。当浏览器请求的页面创建了persistent cookie的时候,浏览器将会把cookie保存在本地硬盘上
            创建一个persistent cookie,例如
                HttpCookie myCookie = new HttpCookie("myCookie", "Hello");
                myCookie.Expires = new DateTime(2008, 01, 01);
                Response.Cookies.Add(myCookie);
        Setting Cookie Properties
            Cookie有很多属性,
                Domain,cookie适用的范围,表明浏览器在请求哪些网页的时候需要发送cookie,例如,www.microsoft.com
                Expires,对于persistent cookie而言的过期日期
                HasKeys,一个bool值,表明cookie是否在cookie字典中
                Name,cookie的名字
                Path,和cookie联系在一起的路径,默认是/
                Secure,决定cookie是否通过加密连接传送,默认是false
                Value,cookie的值
                Values,一个NameValueCollection类的实例,代表了存储在cookie字典中的所有键值对
            在上面的属性中,需要说的一点是cookie dictionary,也就是cookie字典,什么是cookie字典呢?
                cookie dictionary是一个单独的cookie,其中存放了多个键值对
        Examining Limitations of Cookies
            cookie有很多的缺陷,当然也很有用,缺陷有,
                尺寸太小,只有4k
                cookie的值只能够是string类型
                cookie需要浏览器的支持,但是有很多浏览器不支持,或者很多浏览器可以进行选择是否支持cookie
            很多时候,cookie就是作为了一个识别用户的手段
    16.2 Using Session State
        Asp.Net框架包括一种内置的自动跟踪和关联服务器资源与特定用户的机制,这就是Session State,会话状态
        默认情况下,当用户首次请求Asp.Net站点的Page的时候,站点会自动把一个会话cookie加入到用户的浏览器中,这个cookie被命名为_ASP.Net_SessionID
        Adding Items to Session State
            增加项目到Session State中
                Session["myItem"] = "Hello"; //在session state中新增了一项叫myItem,值是Hello
            读取Session State中的项目
                Response.Write(Session["myItem"]); //读取session state中叫myItem的值
            需要注意的是,
                除非关闭了浏览器,否则,因为用户持续性的访问,Session state会一直存在于服务器的内存中
                Session State中的项目是和用户相关的,不会产生冲突。服务器上会为每一个User建立一个Session State的
                可以把任何对象加入到Session State中,因为Session State是存放在服务器上的,所以,没有cookie的那种值必须是string类型的限制
        Removing Items from Session State
            移除单个Session State项目
                Session.Remove("myItem");
            移除所有项目
                Session.RemoveAll();
        Starting a User Session
            使用Session.NewSession属性,可以侦测到是否开始了一个新的Session,如果Session.NewSession=true,就是开始了一个新Session
            每一个用户会话都会分配一个唯一的session id,可以使用Session.SessionID获取这个ID
        Ending a User Session
            通过设定Session.Timeout属性,来设定Session的失效时间
            也可以通过在web.config文件的sessionState section设定timeout属性来设定失效时间
            通过Session.Abandon()方法,可以强制的终止一个用户会话
        Handling Session Events
            关于Session State的事件有两个,分别是,
                Session_Start,用户请求第一个page的时候触发
                Session_End,,用户会话结束的时候触发
            通过在Global.asax文件中加入程序,可以捕获这两个事件
        Storing Session State in Process
            默认情况下,Session State是存储在和IIS同一个进程中的
            优点在于,
                如果存储在其他的进程中,需要额外的进行RPC调用,效率低了很多
            缺点在于,
                如果服务器崩溃了,存储在session state中的数据全部丢失
                session state不能够被多个服务器所共享
        Storing Session State in a Windows Service
            可以把session state存储在windows的服务中,步骤如下,
                启动ASP.NET State服务
                在web.config文件中,设置sessionstate模式为stateserver,并且定位state服务的位置
            这样子,如果在指定state服务位置的时候,使用其他服务器的IP地址以及端口号,那么就可以使用其他机器存储session state了
        Storing Session State in a Database Table
            可以把session state存储在MS SQL Server的数据库中,优势在于可以使用cluster以免一台server宕掉后没有办法进行容灾
            使用以下步骤进行设置,
                执行InstallSqlState.sql,创建必要的数据表
                修改web.config文件的sessionState模式为SQLServer,并指定SQL Server数据库的位置
        Disabling Session State
            通过<%@ Page EnableSessionState="False" %>指令来禁止Session State
            通过<%@ Page EnableSessionState="ReadOnly" %>指令可以保证能够从Session state获得对象,但是不可以向session state中添加对象
            也可以在web.config文件中,设定sessionState的mode属性为off,从而禁止Session State
    16.3 Using Cookieless Sessions
        Session State需要依靠cookie,在很多的时候,cookie是被禁止掉的,那么就需要一个小策略来完成user的识别工作,使用的办法是在request中,加入一个字符串,作为用户识别的ID
        配置实现cookieless,
            在web.config文件中,设定sessionState section下的cookieless属性为true就可以了
        Examining Limitations of Cookieless Sessions
            使用cookieless的缺点很明显,不能够在连接页面的时候使用绝对定位的URL,只能够使用相对定位的URL

CHAPTER 17 Caching ASP.NET Applications
    17.1 Using Page Output Caching
        使用Page的输出缓存会大幅度提升效率,不必每次请求都去产生一个新页面,直接从缓存中拿出一个来,多方便
        使用形如<%@ OutputCache Duration="300" VaryByParam="none" %>的指令可以完成页面缓存
        Varying Cache Contents by Parameter
            OutputCache指令有参数VaryByParam用来表明,在请求带有参数的时候如何进行页面缓存
            VaryByParam可以选择的值有,
                none,对于不同的参数,不会产生新的缓存页面
                *,表明只要请求中的参数不同,就要产生新的缓存页面
                value,例如"UserName"之类的,指定了请求中某个Param的名称,表示,当请求中的"UserName"参数发生变化的时候,就产生一个新的缓存页面。如果需要指定多个参数,那么就用分号分隔开参数,就可以了
        Varying Cache Contents by Header
            Asp.Net框架的一个优点在于可以根据不同的浏览器类型产生相应的html代码,但是如果使用缓存,就出现问题了,对于所有的浏览器都是取出缓存中的版本进行返回,那么asp.net的这一个优势就没有了,为了解决这个问题,asp.net提出了可以根据Http协议头进行不同的缓存
            VaryByHeader,就是根据Http协议头的不同进行不同的缓存,具体值有,
                User-Agent,表明,根据浏览器的不同进行缓存
                Referer/Accept-Language/Host等等,可以看看Http协议,就明白这些值的意思了
        Varying the Cache Contents by a Custom String
            使用VaryByHeader="User-Agent"的问题是,User-Agent不仅包含了浏览器类型的不同,而且还有浏览器的版本等其它信息,所以,用VaryByHeader="User-Agent",不能够完全明显的区分浏览器,所以,有了VaryByCustom属性
            VaryByCustom="Browser"属性说明,根据浏览器的不同,产生不同的页面缓存
            同时,也可以指定其他的字符串作为VaryByCustom的属性值,但是要在Global.asax文件中虫在GetVaryByCustomString()方法来自定义处理程序
        Setting the Cache Location
            使用OutputCacheLocation属性可以指定缓存存放的位置,具体有,
                Any,默认值,页面可以被缓存在任何位置
                Client,页面缓存在浏览器上
                Downstream,页面缓存在非服务器上
                None,不缓存页面
                Server,缓存在服务器上
        Working with the HttpCachePolicy Class
            页面缓存是被HttpCachePolicy类来处理的,如果需要更多的对缓存的控制,可以直接调用这个类的方法
            最重要的两个方法是,
                HttpCachePolicy.SetExpires(),用于指定一个绝对定位的时间,用于表明页面失效的日期
                HttpCachePolicy.SetCacheability()方法,用于表明页面如何被缓存
                    Noche,不缓存
                    Private,页面被缓存在浏览器(默认值)
                    Public,页面被缓存在代理服务器和浏览器上
                    页面被缓存在服务器上           
    17.2 Using Page Fragment Caching
        在某些情况下,缓存页面的一部分比缓存整个页面要有效得多
        页面片段缓存是通过user control来实现的,把一个页面分成几部分,每一个部分都是一个user control,在user control的文件中使用OutputCache指令指定如何/是否缓存
        如果一个user control被使用在多个page中,缓存的时候,是为每一个page保存一份,如果想要共享这些缓存,也就是让user control的缓存保持一份的话,可以使用OutputCache.Shared="true"来设定
        Varying Page Fragment Caching by Parameter
            和在Page上使用OutputCache的VaryByParam属性一样,不多说了
        Examining the Limitations of Page Fragment Caching
            如果user control使用了缓存技术,那么在包含有user control的Page中,就不可以编程访问这个user control了,因为这个User Control已经被缓存了
    17.3 Using Page Data Caching
        前面讲述的都是缓存页面或者页面的某个部分,有的时候,缓存数据可能是更有效的方法
        使用Cache对象在内存中对数据进行缓存
        Adding Items to the Cache
            使用Cache["myItem"] = "Hello";完成对Cache对象中增加项目
            也可以向Cache中增加复杂的对象,例如HashTable,DataSet等等
            需要注意的是,缓存中的内容可以已经被清理掉了,所以,从缓存中得到数据后,必须判定是否为null
            使用Cache.Remove("myItem");来移除缓存中的项目
        Adding Cache File Dependencies
            使用Cache.Insert("myItem","Hello",New CacheDependency(Page.MapPath("myFile.txt"));来向Cache增加一个项目myItem,值为Hello,同时和一个myFile.txt文件联系起来,如果myFile.txt被修改了,那么myItem这一项目就从cache中被移除
            也可以使用String数组来关联一个项目和若干个文件
            为什么有这种缓存文件依赖呢,如果我们有一个配置文件是xml文件,缓存在了内存中,如果被修改了,使用文件依赖,就可以在文件被修改的时候及时知道,并且重新载入文件
        Adding Cache Trigger Dependencies
            在数据库中表的数据被修改的时候,如果能够类似于文件被修改的时候的情景,那么对于缓存一个数据表就方便了很多,但是Cache不支持这种直接对数据表的依赖
            可以变通的方法是,写触发器捕捉对数据表的修改,对于表的更改都会激活触发器,在触发器中,使用存储过程xp_cmdshell把表内容写到一个本地文件中,利用上面的file dependency完成文件依赖,这样,修改了记录,触发器就会重新写一遍本地文件,那么cache就会重新载入本地文件
        Adding Cache Key Dependencies
            通过创建key dependency,可以达到一个cache项目对另一个cache项目的依赖,做法如下,
                String[] arrKeyDepends = new String[]{ "item2" };
                Cache.Insert("item1", "hello", New CacheDependency(null, arrKeyDepends));
            就完成了item1对于item2的依赖,如果item2被修改了,那么item1就会从cache中移除
            通过在string数组中指定多个string,可以完成一个cache项目对多个cache项目的依赖,任何一个作了修改,都会被移除
        Creating an Absolute Expiration Policy
            在给cache添加项目的时候,可以指定一个绝对过期策略。例如,
                Cache.Insert("myItem", "hello", null, DateTime.Now.AddMinutes(1), Cache.NoSlidingExpiration);
            这样就在Cache增加了一个项目myItem,并且这个项目的失效时间是一分钟以后
        Creating a Sliding Expiration Policy
            除了设定一个绝对的失效策略外,也可以指定一个滑动策略。当cache中的某个项目使用了滑动失效策略的时候,在距离上次访问时间一定间隔以后,项目从cache被移除
            具体例子如下,
                Cache.Insert("myItem", "hello", null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(1));
            这样,就在Cache中增加了一个项目,并且表明,如果这个项目在一分钟内没有被访问过,就会从Cache中被移除
        Setting Cache Item Priorities
            在向Cache中插入项目的时候,也可以把优先级也一同指明
            相对优先级,是CacheItemPriority枚举类型的值,具体有,
                AboveNormal,较之于Normal的项目,更小可能性被移除
                BelowNormal,较之于Normal的项目,更大可能性被移除
                Default,默认就是Normal
                High,有这个优先级的项目,很少被移除
                Low,有这个优先级的项目,最有可能被移除
                Normal,项目具有普通的优先级
                NotRemovable,项目永远不能够被移除
        Creating a Cache Callback Method
            在向缓存中插入项目的时候,可以指定回调函数,以便项目被移除的时候,自动调用这个回调函数
            回调函数有几个应用,
                最明显的应用就是,重新把项目装载进缓存
                可以使用回调函数来跟踪Cache对象的行为
            做法步骤是,
                编码一个子程序,参数为string、Object和CacheItemRemovedReason三个,例如
                    void ItemRemoved(String itemKey, Object itemValue, CacheItemRemovedReason removedReason){}
                    itemKey/itemValue传递给回调函数被移除的项目的名称和值
                    removedReason参数是CacheItemRemovedReason枚举类型的值,CacheItemRemovedReason枚举类型表明了项目被移除的原因,具体有,
                    DependencyChanged,因为文件或者key的依赖而被移除
                    Expired,因为过期了被移除
                    Removed,通过Cache.Remove()或者Cache.Insert()方法显示的被移除
                    Underused,因为服务器资源过低,被移除
                创建完子程序后,创建CacheItemRemovedCallback类的实例,并用子程序作为参数初始化这个实例,例如
                    CacheItemRemovedCallback OnRemoved = new CacheItemRemovedCallBack(ItemRemoved);
                最后,在插入项目到缓存中的时候,指定我们创建的CacheItemRemovedCallback类的那个实例,例如
                  Cache.Insert("myItem", "hello", null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.High, OnRemoved);

CHAPTER 18 Application Tracing and Error Handling
    18.1 Responding to Errors
        Asp.Net中会出现四种错误
            Configuration error,配置错误,由于Machine.config或者Web.config文件引起的错误
            Parser error,由于Page中的语法错误造成的
            Compilation error,编译器造成的
            Runtime error,在Page被执行的时候被侦测到的错误
        Viewing Error Information
            两个配置上的设置可以确定错误信息的展现方式,分别是,
                Custom errors mode,在web.config文件中设置customError section的mode属性,通过指定相应的值,来设定是否显示错误以及如何显示,可以选择的值有,
                    Off,禁止自定义错误,只会显示标准的错误
                    On,允许自定义错误,如果没有设定DefaultRedirect,将会发布标准错误
                    RemoteOnly,只允许自定义错误在远程客户机器上显示,在远程计算机上显示自定义的错误,在本地机器上显示的是Asp.Net错误
                Debug mode,如果调试模式开启,那么调试的运行时错误会被显示出来,启动调试模式有两种方法,
                    使用<%@ Page Debug="true" %>指令来完成
                    在web.config文件的compilation section的debug属性上来完成,只要设置debug="true"就可以了
        Page-Level Error Handling
            Catching Exceptions with TRY...CATCH
                对于可能出现异常的代码块,可以放在try...catch块中,如果有异常出现,在catch中捕获,处理就可以了
            Catching Unhandled Exceptions in a Page
                在Page_Error子程序中,可以捕获处理任何发生在Page上的错误,所以,对于没有在Page上捕获、处理的异常,都可以在Page_Error子程序中被处理掉
                HttpServerUtility有两个很重要的方法
                    HttpServerUtility.GetLastError(),可以获得最后一次抛出来的异常
                    HttpServerUtility.ClearError(),清除最后一次抛出来的异常
                可以在Page_Error子程序中,使用利用上面两个方法,通过形如Server.GetLastError()/Server.ClearError()方法来完成对最后抛出的异常的获取以及处理工作
        Application-Level Error Handling
            Using Custom Errors
                通过使用Custom Error自定义错误,可以显示给用户一个比较用户感觉良好的错误信息。
                在允许使用Custom Error之后,可以自动把用户重定向到错误页面下面
                通过配置Web.Config文件的customError section来完成
            Handling Errors in the Global.asax File
                通过在Global.asax文件中,增加Application_Error子程序,可以处理由任何Page抛出的异常
    18.2 Tracing and Monitoring Your Application
        Tracing Page Execution
            Adding Custom Trace Messages
                可以使用Trace.Warn()或者Trace.Write()方法来输出跟踪信息,例如,要跟踪一个变量值的变化,那么在不同的点使用Trace类的两个方法完成这个变量值的输出工作
                Trace.Warn()和Trace.Write()的不同在于前者使用红色字体显示后者是用黑色字体显示
                通过形如<%@ Page Trace="true" %>的指令,设定本页面允许跟踪
                通过Trace.IsEnabled属性,也可以获得页面是否允许跟踪
            Creating Trace Categories
                默认情况下,跟踪信息的显示顺序和程序的执行顺序是一致的
                通过创建不同的类别,可以把跟踪信息按照类别不同进行分组显示,做法是,
                    使用<%@ Page Trace="true" TraceMode="SortByCategory" %>指令,TraceMode有两个可选值
                        SortByTime,按照时间顺序排序,默认的
                        SortByCategory,按照类别进行分组排序
                    在Trace.Warn()和Trace.Write()方法中,使用第一个参数指定类别的名称
            Displaying Errors in Trace Messages
                通过在try...catch块的catch部分,使用Trace输出异常信息,可以获得更丰富的运行时刻错误信息,以便程序的调试
            Using Application-Level Tracing
                可以使用一个名字叫做trace.axd的页面,来显示所有页面的跟踪信息
                在使用trace.asd的页面前,必须在web.config文件中设定允许Application级别跟踪,具体做法是在trace section进行设置
        Monitoring the ASP.NET Process
            IIS的进程名称是inetinfo.exe,而asp.net应用程序运行在aspnet_wp.exe的进程中
            可以在Machine.config中<processModel> section下面进行设置,从而设定asp.net程序的运行方式
        Retrieving Process Information
            使用ProcessModelInfo类来获取Asp.Net进程的信息,具体使用方式,看看ProcessModelInfo类在MSDN中的说明吧
    18.3 Logging Events
        可以通过使用EventLog类,把一些日志信息记录在Window的日志中
        Using Performance Counters
            Using ASP.NET Performance Counters
                Asp.Net性能计数器分为两类,
                    System Performance Counter,系统性能计数器,用于记录每一个应用程序的性能
                    Application Performance Counter,应用程序性能计数器,用于记录特定一个应用程序的性能
                两个计数器都由一大堆的选项,用到的时候再说吧
            Retrieving Performance Counters in an ASP.NET Page
                除了使用性能监视器来监视性能,也可以使用使用System.Diagnostics命名空间中的类在Page中直接获取性能数值
                为了获取特定性能计数,必须提供性能计数的类别名、性能计数器名以及性能计数器实例名,例如
                    PerformanceCounter counter = new PerformanceCounter("Asp.Net Applications", "Request Total", "__Total__");
                创建了性能计数器实例后,可以使用其属性获得性能计数,具体有,
                    RawValue,返回性能计数器在被读取时的原始数值
                    NextValue,返回计数器的计算数值
                    NextSample,返回计数器的示例数值,以便使用CounterSample.Calculate()方法的时候计算统计数值用
    18.4 Using the Debugger
        Attaching the Debugger
            在使用Debugger之前,必须在Web.config文件的compilation section指定debug="true"
        Creating Breakpoints
            创建断点,懒得说了
        Creating Watches
            创建断点,懒得说了
        Stepping Through an ASP.NET Page
            创建断点,懒得说了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值