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. Kafka笔记--监控系统KafkaOffsetMonitor

    KafkaOffsetMonitor下载链接: http://download.csdn.net/detail/changong28/7930337github官方:https://github.co ...

  2. Eclipse远程调试weblogic

    http://www.cnblogs.com/dyllove98/archive/2013/08/06/3241140.html http://blog.csdn.net/afgasdg/articl ...

  3. 智能卡安全机制比较系列(一)CardOS

    自从智能卡开始进入人们的日常生活之后,大家对于智能卡的安全性普遍看好,但是不同公司的智能卡在安全机制的实现方面也存在很多的差异.对于智能卡应用开发和智能卡COS设计人员来说,如果能够更多地了解不同公司 ...

  4. windows 挂载linux nfs

    windwos挂载linux主机NFS 启动windos NFS客户端服务: 1. 打开控制面板->程序->打开或关闭windows功能->NFS客户端 勾选NFS客户端,即开启wi ...

  5. BZOJ1270: [BeijingWc2008]雷涛的小猫

    1270: [BeijingWc2008]雷涛的小猫 Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 836  Solved: 392[Submit][ ...

  6. 【转】彻底解决INSTALL_FAILED_UPDATE_INCOMPATIBLE的安装错误

    原文网址:http://bbs.9ria.com/thread-245162-1-1.html 利用adb shell进入系统,进入/data/app或者/data/data,删除跟你安装的apk同样 ...

  7. requirejs-define jquery 快速初学实例(一)

    原文地址:http://6yang.net/articles_view.php?id=1103 2011-10-18 13:12:01 by [6yang], 1029 visits, 收藏 | 返回 ...

  8. 【HDU】I love sneakers!(分组背包)

    看了许多的题解,都有题目翻译,很不错,以后我也这样写.直接翻译样例: /*鞋子的数量N[1, 100]; 拥有的金钱M[1, 1w]; 品牌数目[1, 10]*/ /*以下四行是对于每双鞋的描述*/ ...

  9. MergeSort 归并排序

    实现: 二路归并 public class TestMergeSort { public int[] mergeSortArray(int[] arr, int left, int right){ i ...

  10. Struts分页

    1.分页的bean类PaginationSupport.java  2.写好后直接在action里面调用,计算当前页显示的数据  3.写一个公用的jsp页面,直接在需要分页的页面include就可以了 ...