.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.com的Url访问,则可以配置移动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.NET的Web窗体文件
.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_GlobalResources或App_LocalResources子目录
资源文件
.css
应用程序根目录或子目录,或App_Themes子目录
用于确定HTML元素格式的样式表文件
.htm、.html
应用程序根目录或子目录
用HTML代码编写的静态Web文件
19.2.3 移动Web网站路径
使用移动Web站点中的资源时,通常必须指定资源的路径。例如,可以使用URL路径引用页面中的图像文件或网站中其他位置处页面的URL。同样,移动Web应用程序中的代码,可以使用基于服务器文件的物理文件路径对文件进行读写操作。ASP.NET提供用于引用资源,并确定应用程序中的页面或其他资源的路径的方法。通常页面中的元素或移动控件必须引用外部资源,如文件。ASP.NET可以通过各种方法引用外部资源,而所选的具体方法取决于使用客户端元素还是移动控件。
客户端元素以原样传递给浏览器。因此,从客户端元素中引用资源时,应根据HTML中URL的标准规则构造路径。可以使用绝对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服务器请求应用程序资源。
(2)ASP.NET接收客户端对应用程序的第一个请求。
(3)ASP.NET为每个请求创建并初始化核心对象。如HttpContext、HttpRequest和HttpResponse。
(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_Start和Application_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)开始阶段。在开始阶段,将设置页属性,如Request和Response。
(3)页初始化阶段。初始化页面中的控件。
(4)加载阶段。加载期间,如果当前请求是回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。
(5)验证阶段。在验证期间,将调用所有验证程序控件的Validate方法。
(6)回发事件处理阶段。如果请求是回发请求,则将调用所有事件处理程序。
(7)呈现阶段。在呈现期间,将所呈现的输出提供给页的Response属性的OutputStream。
(8)卸载阶段。卸载页属性(如Response和Request)并执行清理。
在页生命周期的每个阶段中,页将引发可运行自己的代码进行处理的事件。对于控件事件,通过以声明方式使用属性(如onclick)或以使用代码的方式,均可将事件处理程序绑定到事件。页面还支持自动事件连接,即ASP.NET将寻找具有特定名称的方法,并在引发特定事件时自动运行这些方法。如果@Page指令的AutoEventWireup属性设置为true(默认设置),页事件将自动绑定至使用Page_event命名约定的方法,如Page_Load和Page_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移动控件都有自己的生命周期,而且生命周期与页面生命周期类似。例如,在相应的页事件期间将调用控件的Init和Load方法。如果页上包含控件,则将首先调用控件的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方法。此适配器方法可以详细报告错误,并返回一个指示错误已得到处理的值。如果它不这样做,则继续处理异常。
(3)ASP.NET自动使用自定义错误页。
(4)ASP.NET调用在第1步中安装的错误处理程序。如果目标设备是能够呈现完整的ASP.NET生成的错误信息的HTML浏览器,则返回此方法。
(5)否则,该事件首先收集与异常有关的信息,然后该事件创建类System.Web.Mobile. UI.MobileControls.ErrorFormatterPage的内部定义的移动页的实例,将数据绑定到所收集的数据,并且呈现结果。此页负责生成简洁的特定于设备的错误信息。
(6)因为异常已被处理,所以该事件不返回HTTP错误状态代码。
- .NET compact FrameWork移动开发指南-19
- 《.NET Compact Framework 移动开发指南》,即将与大家见面
- 新书《.NET Compact Framework 移动开发指南》章节连载
- 《.NET Compact Framework移动开发指南》答疑一
- 《.NET Compact Framework移动开发指南》答疑一
- 《.NET Compact Framework 移动开发指南》,即将与大家见面
- .NET Compact Framework 移动开发步步来(1)
- .NET Compact Framework 移动开发步步来(2)
- .NET Compact Framework 移动开发步步来(3)
- .NET Compact Framework 移动开发步步来(4)
- 用 SQL Server CE 2.0 和.NET Compact Framework 开发紧凑而功能强大的移动应用程序
- Microsoft .NET Compact Framework 开发常见问题解答
- 用.net compact framework开发pda程序
- Microsoft .NET Compact Framework 开发常见问题解答
- Microsoft .NET Compact Framework 开发常见问题解答
- Microsoft .NET Compact Framework 开发常见问题解答
- .net compact framework
- .NET Compact Framework 编程
- 使MessageBox框自动关闭
- 邮票问题
- 固定单文档的窗口大小
- MMS 协议概述
- 对话框如何嵌入到视图客户区中
- .NET compact FrameWork移动开发指南-19
- ubuntu下忘记root密码重装mysql的经验
- 在MyEclips中使用JPA(Java persistence API)
- MySQL engine/type类型InnoDB/MYISAM/MERGE/BDB/HEAP的区别
- Socket通信基础知识
- 成功并不像你想像的那么难
- OPENGL.PAS单元函数一览表
- 触发器
- MySQL中默认值中用时间函数的问题