0 剖析ASP.NET应用程序

用户运行ASP.NET应用程序,不是直接运行,而是使用浏览器(比如IE)通过HTTP请求一个特定的URL(如http://www.mysite.com/mypage.aspx)。这个请求由Web服务器接收。在VS中调试应用程序时,你使用的使本地的测试服务器。而部署应用程序时,使用IIS Web服务器。Web服务器把请求传送给ASP.NET工作者进程,ASP.NET工作者进程会根据虚拟目录把代码的执行隔离到不同的应用程序域。同一个虚拟目录(或它的某个子目录)中的网页在同一个应用程序域中执行。不同的虚拟目录中的网页分别在独立的应用程序域中执行。

ASP.NET应用程序可以包含如下元素:

  1. Web窗体(.aspx文件)。这是ASP.NET应用程序的基础。
  2. 母版页(.master文件)。它们是模板,基于它创建的不同Web表单具有相同的结构。
  3. Web服务(.asmx文件)。它们允许你与其他计算机和其他平台上的应用程序共享有用的功能。
  4. 代码隐藏文件。根据所使用的代码模型,你还可以有单独的源代码文件。如果使用C#编码,它们具有.cs扩展名。
  5. 配置文件(.config)。这个文件包含应用程序级别的设置,它配置从安全到调试和状态管理的所有项目。
  6. global.asax。这个文件包含相应全局应用程序事件的事件处理程序(如应用程序第一次启动时的事件)。
  7. 其他组件。这些是编译后的程序集,包括由你自己开发或者由第三方开发的具有有用功能的独立组件。通过组件,你可以把业务和数据访问逻辑分离,还可以创建自定义控件。

0.1 应用程序更新

  ASP.NET执行模型的一个最出色的特性是你可以随时更新Web应用程序而不必重新启动Web服务器,也不用担心会影响到现有的客户。也就是说,你随时可以往虚拟目录中添加、替换或删除文件。ASP.NET会执行你修改web.config配置文件时的同样动作,切换到一个新应用程序域。

0.2 应用程序目录结构

  

ASP.NET的特殊目录
Bin 包含ASP.NET Web应用程序使用的所有预编译的.NET程序集(通常是DLL)。这些程序集可以包含预编译的网页类以及这些类引用的其他程序集。
App_Code 包含要在应用程序中使用的动态编译的源代码文件。
App_GlobalResources 这个目录保存可以被Web应用程序里的所有页面访问的全局资源。
App_LocalResources 除了这些资源只能够被专门的页面访问之外,这个目录的作用和App_GlobalResources相同。
App_WebReferences 这个目录保存Web应用程序所使用的对Web服务的引用。包括WSDL文件和发现文档。
App_Data 这个目录用于数据存储,包括SQL Server Express数据库文件以及XML文件。
App_Browsers 包含保存在XML文件里的浏览器定义。这些XML文件为各个程序活动定义客户端浏览器的兼容性。
App_Themes

这个目录保存Web应用程序使用的主题。

1 global.asax应用程序文件

global.asax文件允许你编写响应全局事件的事件处理程序。用户不会直接请求global.asax文件。global.asax文件自动执行它的代码来响应特定的应用程序事件。

global.asax文件是可选的,但Web应用程序的global.asax文件不可以多于一个,且它必须位于应用程序的根目录而不位于子目录内。

1.1 应用程序事件

你可以在global.asax文件中处理两类事件。

  1. 对每次请求都发生的事件。包括与请求相关的和响应相关的事件。
  2. 只在某些特定情况下才发生的事件。

请求的事件按如下顺序发生。

  1. Application_BeginRequest()。这个方法在每次请求开始时被调用。
  2. Application_AuthenticateRequest()。这个方法在执行验证前发生。这是创建你自己的验证逻辑的起点。
  3. Application_AuthorizeRequest()。发生在用户验证(识别)后,此时应该确定用户的权限。你可以用这个方法给用户赋予特殊的权限。
  4. Application_ResolveRequestCache()。这个方法常和输出缓存一起使用。
  5. 在这个时候,请求被转交给合适的处理程序。例如,对于Web窗体的请求,此时应该编译(如有必要)页面并把它实例化。
  6. Application_AcquireRequestState()。在为客户读取回话特定的信息并把这些信息填充到Session集合前,该方法被调用。
  7. Application_PreRequestHandlerExecute()。这个方法在合适的HTTP处理程序执行请求前调用。
  8. 此时,适当的处理程序执行请求。例如,如果是对Web窗体的请求,页面的事件处理程序代码就会被执行,页面呈现为HTML。
  9. Application_PostRequestHandlerExecute()。这个方法在请求被处理后调用。
  10. Application_ReleaseRequestState()。这个方法在回话特定信息即将从Session集合序列化时调用,这样它可以用于下一个请求。
  11. Application_UpdateRequestCache()。这个方法在信息加入到输出缓存前被调用。例如,如果你启用了某个网页的输出缓存,ASP.NET在这个时候把呈现的HTML插入到页面。
  12. Application_EndRequest()。这个方法在请求结束时但在对象被释放和重新创建前被调用。适合在这时候清理代码。

某些事件并不在每次请求时都发生,如下所示。

  1. Application_Start()。这个方法在应用程序第一次启动和应用程序域被创建时被调用。这个事件处理程序适合提供应用程序范围的初始化代码。例如,这时候你可以加载和缓存在整个应用程序生命期内不会变化的数据,如导航树、静态的产品列表等。
  2. Session_Start()。这个方法在每次回话开始时调用。常用于初始化用户特定的信息。
  3. Application_Error()。这个方法在应用程序发生了未处理的异常时被调用。
  4. Session_End()。这个方法在用户的会话结束时被调用。会话在你的代码显式释放它或者超过某个指定的时间(一般是20分钟)没有请求后结束。这个方法常用于清理相关的数据。
  5. Application_End()。这个方法在应用程序结束前被调用。应用程序的结束可能是因为IIS被重新启动或者因为对文件的更新或进程回收导致应用程序切换到一个新的应用程序域。
  6. Application_Disposed()。这个方法在应用程序被关闭一段时间后并且在.NET垃圾回收器准备收回它占用的内存时被调用。

应用程序事件常用于执行应用程序初始化、清理、使用日志、用户配置以及故障排除。不过,不要假设你的应用程序必须使用全局应用程序事件。很多ASP.NET应用程序根本就不使用global.asax文件。

2 ASP.NET配置

ASP.NET里的配置由XML配置文件管理。配置ASP.NET应用程序的核心设置所需的信息以及应用程序的自定义信息都保存在这些配置文件里。

与传统的ASP配置文件相比,ASP.NET配置文件具有以下优点:

  1. 它们不会被锁定。你可以在任何时刻更新配置设置,并且ASP.NET会自动平滑地转移到一个新应用程序域。
  2. 它们方便访问和复制。只要你有合适的网络权限,就可以从远程计算机修改配置文件(甚至通过FTP上传一个新版本)。你还可以复制一个配置文件并将其应用到其他应用程序或者在Web集群环境下运行同一个应用程序的其他Web服务器。
  3. 它们方便编辑和理解。配置文件里的设置是可读的,也就是说,不必借助任何特殊的配置工具,它们就可以被人编辑和理解。

主要的配置文件由machine.config和web.config。

3 .NET组件

用ASP.NET编写的设计良好的Web应用程序通常会包含单独的组件,它们用于区分数据层和业务层。创建这些组件后,就可以从ASP.NET网页无缝地使用它们了。

创建组件的方式有两种:

  1. 在App_Code子目录中创建一个新的.cs文件。
  2. 在VS里创建一个新的类库项目。

虽然这两种方式在本质上相同,但它们对代码的管理却很不相同。当你希望在多个web应用程序里面重用组件时尤为如此。如果采用App_Code方式,很容易做一些轻微的修改从而导致共享类版本的混乱。第二种方式更适合一个开发团队开发大型应用程序,这种情况下,你会希望能够自由地独立完成并编译web应用程序的不同部分。由于这些原因,类库的方式通常为专业的应用程序所采用。(App_Code子目录应该只被用于和web应用程序紧密耦合的类。)

参考文献:《ASP.NET 4 高级程序设计》

ASP.NET学习笔记——ASP.NET应用程序的更多相关文章

  1. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  2. 微信小程序开发:学习笔记[7]——理解小程序的宿主环境

    微信小程序开发:学习笔记[7]——理解小程序的宿主环境 渲染层与逻辑层 小程序的运行环境分成渲染层和逻辑层. 程序构造器

  3. Linux进程线程学习笔记:运行新程序

    Linux进程线程学习笔记:运行新程序                                         周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下 ...

  4. .net学习笔记----Asp.net的生命周期之一应用程序生命周期

    Http请求刚刚到达服务器的时候 当服务器接收到一个 Http请求的时候,IIS (Internet Information Services,互联网信息服务)首先需要决定如何去处理这个请求. 什么是 ...

  5. Asp.Net 学习笔记(IIS不同版本和Asp.Net)

    主要目的是在网上记录一下学习笔记,如有不对,请指出 谢谢!! iis5.x: 存在问题,inet info收到动态请求后,aspnt_isapi.dll会被加载到inetinfo.exe(挂载w3sv ...

  6. .net学习笔记---Asp.net的生命周期之二页生命周期

    用户请求 从 用户角度来说,我不管你后台经历了什么,我只想要我请求的页面.请求到服务器端,服务器必须得有所表示的是吧,即使不想搭理人家也得让IIS给人家说声:找不到服务器.请求来到服务器端,肯定要让服 ...

  7. ASP.NET学习笔记--自己写的Login.aspx

    以前有大学有学过,但是没学好,现在准备完全自己动手做一个网站,学习一下ASP.NET 做一个登录页面,首先要有创建一个新的网站,添加Login.aspx,然后做出自己想要的DIV和CSS布局, 之后创 ...

  8. ASP.NET学习笔记(一)相关概念

    ASP.NET 是一个开发框架,用于通过 HTML.CSS.JavaScript 以及服务器脚本来构建网页和网站. ASP.NET 支持三种开发模式: Web Pages MVC Web Forms ...

  9. ASP.NET学习笔记01

    ASP.NET初级工程师的核心要求:能够实现一个基本的网站. ASP.NET初级工程师面试主要要求: 1.基础的数据结构和算法 2.C#编程语言基础 3.网站基础(HTML,CSS,Javascrip ...

随机推荐

  1. linux下安装eclipse

    最开始的版本OpenSuse + jre-7u25-linux-i586.tar.gz + eclipse-cpp-kepler-R-linux-gtk.tar.gz 配置好java环境后启动ecli ...

  2. Proguard中optimize设置不当引发SimException

    今天来说一下Proguard中关于optimize的问题.先上一张异常图片 最近项目重构,重新调整了各个组件之间的依赖关系.过程中,在项目Proguard这块卡住了,最开始还好,Proguard只是提 ...

  3. OC高级编程——深入block,如何捕获变量,如何存储在堆上

    OC高级编程——深入block,如何捕获变量,如何存储在堆上   首先先看几道block相关的题目 这是一篇比较长的  博文 ,前部分是block的测试题目,中间是block的语法.特性,block讲 ...

  4. iOS知识点全梳理-备用

    感谢大神分享 文/Jack_lin(简书作者)原文链接:http://www.jianshu.com/p/5d2163640e26著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 序言 ...

  5. Ubuntu 14.04 标题栏实时显示上下行网速、CPU及内存使用情况

    首先当然是用wget下载indicator-sysmonitor,终端执行命令:wget -c https://launchpad.net/indicator-sysmonitor/trunk/4.0 ...

  6. linux文件合并

    第一:两个文件的交集,并集前提条件:每个文件中不得有重复行1. 取出两个文件的并集(重复的行只保留一份)2. 取出两个文件的交集(只留下同时存在于两个文件中的文件)3. 删除交集,留下其他的行1. c ...

  7. HDU5584 LCM Walk 数论

    LCM Walk Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  8. Exchange Server 2010/2013功能差异

  9. 自制USB wifi信号放大天线

    这是我的usb wifi天线第一个版本,灵感来自: http://www.instructables.com/id/EQARE4I72GEPUCHTHU/ http://www.usbwifi.orc ...

  10. c语言验证哥德巴赫猜想(从4开始 一个偶数由两个质数之和)

    #include <stdio.h> #include <stdlib.h> #include <math.h> int isit(int num) { int i ...