Asp.net移动开发指南(3)

1.2.4 移动Web网站中的共享代码文件夹

如果移动Web应用程序包括要在多个页之间共享的代码,则可以将代码保存在Web应用程序根目录下的两个特殊文件夹Bin文件夹或App_Code文件夹中。

Bin文件夹用于存储编译过的程序集。Web应用程序的任何代码都能自动引用该文件夹。例如,将某个自定义类编译后得到的程序集,复制到Web应用程序的Bin文件夹中,这样所有页都可以使用这个类。Bin文件夹中的程序集无需注册。只要.dll文件存在于Bin文件夹中,ASP.NET就可以识别它。如果更改了.dll文件,并将它的新版本重新复制到Bin文件夹中,ASP.NET会检测到更新,并对随后的新页请求使用新版本的.dll文件,也就是业界常说的Web应用热部署。

App_Code文件夹用于存储源代码,在运行时ASP.NET将自动对这些代码进行编译。Web应用程序中的其他任何代码都可以访问产生的程序集。因此,App_Code文件夹的工作方式与Bin文件夹很类似,而不同之处是其中存储的是未编译的源代码。App_Code文件夹及其在ASP.NET Web应用程序中的特殊定义,使开发人员可以创建自定义类和其他仅源代码文件,并在Web应用程序中使用它们,而不必单独对它们进行编译。App_Code文件夹通常包含以传统类文件(即带有.vb.cs等扩展名的文件)的形式编写的源代码文件。根据需要,App_Code文件夹可以包含任意数量的文件和子文件夹。

1.2.5 移动Web应用程序生命周期

ASP.NET中,若要对ASP.NET应用程序进行初始化并使它处理请求,必须执行一些处理步骤。ASP.NET应用程序生命周期包括以下几个阶段:

1)用户从Web服务器请求应用程序资源。

2ASP.NET接收客户端对应用程序的第一个请求。

3ASP.NET为每个请求创建并初始化核心对象。如HttpContextHttpRequestHttpResponse

4)将HttpApplication对象分配给请求。

5)由HttpApplication管线处理请求,触发HttpApplication类的一系列事件。

在应用程序的生命周期期间,应用程序会引发可处理的事件并调用可重写的特定方法。若要处理应用程序事件或方法,可以在应用程序根目录中创建一个名为Global.asax的文件。 如果创建了Global.asax文件,ASP.NET会将其编译为从HttpApplication类派生的类,然后使用该派生类表示应用程序。

HttpApplication进程的一个实例,每次只处理一个请求。由于在访问应用程序类中的非静态成员时不需要将其锁定,可以简化应用程序的事件处理过程。这样还可以将特定于请求的数据,存储在应用程序类的非静态成员中。例如,可以在Global.asax文件中定义一个属性,然后为该属性赋一个特定于请求的值。

通过使用命名约定Application_event(如Application_BeginRequest),ASP.NET可以在Global.asax文件中将应用程序事件自动绑定到处理程序。这与将ASP.NET页面方法自动绑定到事件(如页的Page_Load事件)的方法类似。Application_StartApplication_End方法是不表示HttpApplication事件的特殊方法。在应用程序域的生命周期期间,ASP.NET仅调用这些方法一次,而不是对每个HttpApplication实例都调用一次。图1-1说明了应用程序域与HttpApplication实例之间的关系。

1-1 应用程序域与HttpApplication实例之间的关系

1-4列出在应用程序生命周期期间最常用的一些事件和方法。

1-4 事件和方法

事件或方法

说明

Application_Start

请求ASP.NET应用程序中第一个资源(如页)时调用。在应用程序的生命周期期间仅调用一次Application_Start方法

Application_ event

在应用程序生命周期中的适当时候,触发HttpApplication类的一系列事件

HttpApplication.Init

在创建了所有模块之后,对HttpApplication类的每个实例都调用一次

Dispose

在销毁应用程序实例之前调用。可使用此方法手动释放任何非托管资源

Application_End

在卸载应用程序之前,对每个应用程序生命周期调用一次

1.2.6 移动Web页面生命周期

ASP.NET页面运行时,此页面将经历一个生命周期。页面在生命周期中将执行一系列处理步骤。这些步骤包括初始化、实例化控件、还原和维护状态、运行事件处理程序代码以及进行呈现。了解页面的生命周期非常重要,这样就能在合适的生命周期阶段编写代码,以达到预期效果。此外,如果开发自定义控件,则必须熟悉页生命周期,从而正确地初始化控件,使用视图状态数据填充控件属性以及运行所有控件行为逻辑。常规页面生命周期包括以下几个阶段:

1)页面请求阶段。页面请求发生在页生命周期开始之前。

2)开始阶段。在开始阶段,将设置页属性,如RequestResponse

3)页初始化阶段。初始化页面中的控件。

4)加载阶段。加载期间,如果当前请求是回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。

5)验证阶段。在验证期间,将调用所有验证程序控件的Validate方法。

6)回发事件处理阶段。如果请求是回发请求,则将调用所有事件处理程序。

7)呈现阶段。在呈现期间,将所呈现的输出提供给页的Response属性的OutputStream

8)卸载阶段。卸载页属性(如ResponseRequest)并执行清理。

在页生命周期的每个阶段中,页将引发可运行自己的代码进行处理的事件。对于控件事件,通过以声明方式使用属性(如onclick)或以使用代码的方式,均可将事件处理程序绑定到事件。页面还支持自动事件连接,即ASP.NET将寻找具有特定名称的方法,并在引发特定事件时自动运行这些方法。如果@Page指令的AutoEventWireup属性设置为true(默认设置),页事件将自动绑定至使用Page_event命名约定的方法,如Page_LoadPage_Init

1-5列出了最常用的页面生命周期事件及其常规用途。

1-5 页面生命周期事件

页面事件

常规用途

Page_PreInit

1. 使用IsPostBack属性确定是否是第一次处理该页

2. 创建或重新创建动态控件

3. 动态设置主控页

4. 动态设置Theme属性

5. 读取或设置配置文件属性值

Page_Init

读取或初始化控件属性

Page_Load

读取和更新控件属性

各种控件事件

执行特定于应用程序的处理:

1. 如果页包含验证程序控件,请在执行任何处理之前检查页和各个验证控件的IsValid属性

2. 处理特定事件,如Button控件的Click事件

(续表)

页面事件

常规用途

Page_PreRender

对页的内容进行最后更改

Page_Unload

执行最后的清理工作,可能包括:

1. 关闭打开的文件和数据库连接

2. 完成日志记录或其他特定于请求的任务

各个ASP.NET移动控件都有自己的生命周期,而且生命周期与页面生命周期类似。例如,在相应的页事件期间将调用控件的InitLoad方法。如果页上包含控件,则将首先调用控件的Init方法,然后调用页的Init方法。在调用控件的Load方法之前,应该先调用页面的Load方法。

1.2.7 自适应错误报告

在移动Web应用程序中进行自定义错误报告的工作方式,与其在标准ASP.NET中的工作方式基本相同。同样可以在web.config文件中,为错误指定一组自定义页。在发生错误后,ASP.NET检查应用程序是否配置为显示自定义错误,并且检查是否存在适当的错误页。如果上述任何一种检查的结果为真,则ASP.NET重定向到该错误页,并且传递包含原始URL的参数。

对于移动Web应用程序,ASP.NET使用一个由6个步骤组成的进程查找和报告错误,这一进程以产品安装开始,一直延续到发送错误输出:

1)将HTTP模块安装到标准应用程序链中。此模块(属于System.Web.Mobile. ErrorHandlerModule类)为应用程序的错误事件安装事件处理程序。

2)在页生命周期内,如果页级别发生异常,ASP.NET调用将该页的OnError方法。因为该页是移动页,所以将调用MobilePage中的重写实现,而该重写实现又调用所分配的页适配器的HandleError方法。此适配器方法可以详细报告错误,并返回一个指示错误已得到处理的值。如果它不这样做,则继续处理异常。

3ASP.NET自动使用自定义错误页。

4ASP.NET调用在第1步中安装的错误处理程序。如果目标设备是能够呈现完整的ASP.NET生成的错误信息的HTML浏览器,则返回此方法。

5)否则,该事件首先收集与异常有关的信息,然后该事件创建类System.Web.Mobile. UI.MobileControls.ErrorFormatterPage的内部定义的移动页的实例,将数据绑定到所收集的数据,并且呈现结果。此页负责生成简洁的特定于设备的错误信息。

6)因为异常已被处理,所以该事件不返回HTTP错误状态代码。

http://hi.baidu.com/zhiwei%5F117/blog/item/8ff2076fe53c3ad080cb4a4f.html

加支付宝好友偷能量挖...


评论(0)网络
阅读(131)喜欢(0)Asp.Net/C#/WCF