.NET compact FrameWork移动开发指南-19

来源:互联网 发布:java企业面试题 编辑:程序博客网 时间:2024/03/28 20:55

 

19.2  移动Web网站

利用ASP.NET创建移动Web网站时,可以包含ASP.NET能够识别处理的特定类型的文件。此外,还可以创建用于特殊用途(如用于存储源代码)的文件夹。本节介绍有关ASP.NET能够识别以进行特殊处理的文件和文件夹,以及如何在应用程序中引用它们的内容。

19.2.1  移动Web网站布局

可以将网站的文件保存在方便应用程序访问的任何文件夹结构中。除此ASP.NET还保留了一些可用于特定类型的文件和文件夹定义。

1. 默认页面

可以为应用程序建立默认页面,这将使用户更容易定位到移动Web站点。默认页面是用户访问移动Web站点时,没有指定特定页面的情况下站点为用户默认提供的页面。例如,可以创建一个名为Default.aspx的页面,并将它保存在移动Web站点的根文件夹中。如果用户在访问移动Web站点时没有指定特定页面,如直接使用http://www.contoso.comUrl访问,则可以配置移动Web站点,以便自动请求Default.aspx页面。默认页可以作为移动Web站点的主页,或者在页面中写入代码重定向到其他Url

2. 应用程序文件夹

ASP.NET能够识别用于特定类型内容的文件夹名称。表19-1列出了保留的文件夹名称以及文件夹中通常包含的文件类型。

19-1  ASP.NET的应用程序文件夹

文件夹

说明

App_Browsers

包含ASP.NET用于标识个别浏览器并确定其功能的浏览器定义(.browser)文件

App_Code

包含希望作为应用程序一部分进行编译的类和业务对象(例如.cs.vb文件)的源代码。在动态编译的应用程序中,当对应用程序发出首次请求时,ASP.NET编译App_Code文件夹中的代码,然后在检测到任何更改时重新编译该文件夹中的项

App_Data

包含应用程序数据文件,包括MDF文件、XML文件和其他数据存储文件ASP.NET 2.0使用App_Data文件夹来存储应用程序的本地数据库,该数据库可用于维护成员资格和角色信息

App_WebReferences

包含用于定义在应用程序中使用的Web引用的引用协定文件(.wsdl文件)、架构(.xsd文件)和发现文档文件(.disco.discomap文件)

App_GlobalResources

包含编译到具有全局范围的程序集中的资源(.resx.resources文件)App_GlobalResources文件夹中的资源是强类型的,可以通过编程方式进行访问

App_LocalResources

包含与应用程序中的特定页面、用户控件或母版页关联的资源(.resx.resources文件)

App_Themes

包含用于定义ASP.NET网页和控件外观的文件集合(.skin.css文件以及图像文件和一般资源)

Bin

包含要在应用程序中引用的控件、组件或其他代码的已编译程序集(.dll文件)。在应用程序中将自动引用Bin文件夹中的代码所表示的任何类

3. 管理子文件夹

站点的配置设置可以通过Web.config文件进行管理,该文件位于站点的根文件夹中。如果在子文件夹中包含有文件,则可以通过在该文件夹中创建Web.config文件来为这些文件维护单独的配置设置。如果配置设置作为整体应用于站点,则不能在子文件夹级别设置或重写这些设置。

4. 访问权限

如果需要限制对移动Web站点内容的访问,则可以通过配置来限制对个别文件或子文件夹的访问权限的设置。通常可以按用户或角色(组)限制内容。

19.2.2  移动Web网站文件类型

移动Web站点应用程序中可以包含多种文件类型,其中一些文件类型由ASP.NET支持和管理,而其他文件类型则由IIS服务器支持和管理。大多数ASP.NET文件类型,都可以使用Visual Studio 2005中的“添加新项”菜单项创建。

使用应用程序映射,可以将文件类型映射到应用程序。例如,当打开一个具有.txt文件扩展名的文件时,很可能会打开记事本应用程序,因为默认情况下.txt文件类型已映射到Notepad.exe。在Web应用程序中,文件类型会映射到IIS中的应用程序扩展。

通过程序映射由ASP.NET管理的主要文件类型如表19-2所示。

19-2  ASP.NET管理的主要文件类型

文件类型

位置

说明

.asax

应用程序根目录

通常是Global.asax文件

.ascx

应用程序根目录或子目录

Web用户控件文件

.asmx

应用程序根目录或子目录

XML Web services文件

.aspx

应用程序根目录或子目录

ASP.NETWeb窗体文件

.config

应用程序根目录或子目录

通常是 Web.config 配置文件

.cs.vb

App_Code子目录;但如果是ASP.NET页的代码隐藏文件,则与网页位于同一目录

运行时要编译的类源代码文件

.dll

Bin子目录

已编译的类库文件

.mdb.ldb.mdf

App_Data子目录

数据库文件

.resources.resx

App_GlobalResources App_LocalResources 子目录

资源文件

通过程序映射由IIS管理的主要文件类型如表19-3所示。

19-3  IIS管理的主要文件类型

文件类型

位置

说明

.asa

应用程序根目录

通常是Global.asa文件

.asp

应用程序根目录或子目录

ASP页面文件

.config

应用程序根目录或子目录

通常是 Web.config 配置文件

.cs.vb

App_Code子目录;但如果是ASP.NET页的代码隐藏文件,则与网页位于同一目录

运行时要编译的类源代码文件

(续表)

文件类型

位置

说明

.dll

Bin子目录

已编译的类库文件

.mdb.ldb.mdf

App_Data子目录

数据库文件

.resources.resx

App_GlobalResourcesApp_LocalResources子目录

资源文件

.css

应用程序根目录或子目录,或App_Themes子目录

用于确定HTML元素格式的样式表文件

.htm.html

应用程序根目录或子目录

HTML代码编写的静态Web文件

19.2.3  移动Web网站路径

使用移动Web站点中的资源时,通常必须指定资源的路径。例如,可以使用URL路径引用页面中的图像文件或网站中其他位置处页面的URL。同样,移动Web应用程序中的代码,可以使用基于服务器文件的物理文件路径对文件进行读写操作。ASP.NET提供用于引用资源,并确定应用程序中的页面或其他资源的路径的方法。通常页面中的元素或移动控件必须引用外部资源,如文件。ASP.NET可以通过各种方法引用外部资源,而所选的具体方法取决于使用客户端元素还是移动控件。

客户端元素以原样传递给浏览器。因此,从客户端元素中引用资源时,应根据HTMLURL的标准规则构造路径。可以使用绝对URL路径,也可以使用各种类型的相对路径。例如,如果页面包含一个img标记,则可使用如下所示的绝对URL路径或站点根目录相对路径来设置其src属性。

<img src="http://www.contoso.com/MyApplication/Images/Pic.jpg" />

<img src="../Images/Pic.jpg" />

移动控件在引用资源时,同样可以使用绝对路径或相对路径。如果使用相对路径,可以使用Web应用程序根目录运算符(~),在移动控件中指定路径时,可以使用该运算符。ASP.NET会将根目录运算符解析为当前应用程序的根目录,可以结合使用根目录运算符和文件夹来指定基于当前根目录的路径。例如,假设一个用户控件包含一个Image移动控件,图像文件存放在根目录的Images文件夹下,则该移动控件的ImageUrl属性设置为以下路径:

<mobile:Image ID="Image1" Runat="server" ImageUrl="="~/Images/Pic.jpg">

</mobile:Image>

在该示例中,图像文件将从Web应用程序根目录的Images文件夹中直接读取,无论该页面位于站点的什么位置。开发移动Web网站,可以在移动控件的任何与路径有关的属性中使用根目录运算符。

19.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文件夹可以包含任意数量的文件和子文件夹。

19.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实例都调用一次。图19-1说明了应用程序域与HttpApplication实例之间的关系。

 

 

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

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

19-4  事件和方法

事件或方法

说明

Application_Start

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

Application_ event

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

HttpApplication.Init

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

Dispose

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

Application_End

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

19.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

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

19-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方法。

19.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错误状态代码。