asp.net

编辑 锁定
ASP.NET[1] 是.NET FrameWork的一部分,是一项微软公司的技术,是一种使嵌入网页中的脚本可由因特网服务器执行的服务器端脚本技术,它可以在通过HTTP请求文档时再在Web服务器上动态创建它们。 指 Active Server Pages(动态服务器页面) ,运行于 IIS(Internet Information Server 服务,是Windows开发的Web服务器)之中的程序 。
技术名称
ASP.NET
研发公司
微软(Microsoft)
名称简称
.NET
技术全称
Active Server Page .NET

发展起源 编辑

ASP .NET的前身ASP技术,是在IIS2.0上首次推出(Windows NT 3.51),当时与 ADO 1.0 一起推出,在IIS 3.0 (Windows NT 4.0)发扬光大,成为服务器端应用程序的热门开发工具,微软还特别为它量身打造了VisualInter Dev开发工具,在1994年到2000年之间,ASP技术已经成为微软推展Windows NT 4.0平台的关键技术之一,数以万计的ASP网站也是这个时候开始如雨后春笋般的出现在网络上。它的简单以及高度可定制化的能力,也是它能迅速崛起的原因之一。不过ASP的缺点也逐渐的浮现出来:面向过程型的程序开发方法,让维护的难度提高很多,尤其是大型的ASP应用程序。 解释型的VBScript或JScript语言,让性能无法完全发挥。 扩展性由于其基础架构的不足而受限,虽然有COM元件可用,但开发一些特殊功能(如文件上传)时,没有来自内置的支持,需要寻求第三方控件商的控件。
1997年时,微软开始针对ASP的缺点(尤其是面向过程型的开发思想),开始了一个新的项目。当时ASP .NET的主要领导人Scott Guthrie刚从杜克大学毕业,他和IIS团队的Mark Anders经理一起合作两个月,开发出了下一代ASP技术的原型,这个原型在1997年的圣诞节时被发展出来,并给予一个名称:XSP,这个原型产品使用的是Java语言。不过它马上就被纳入当时还在开发中的CLR平台,Scott Guthrie事后也认为将这个技术移植到当时的CLR平台,确实有很大的风险(huge risk),但当时的XSP团队却是以CLR开发应用的第一个团队。
.net .net
为了将XSP移植到CLR中,XSP团队将XSP的内核程序全部以C#语言进行了重构(在内部的项目代号是 "Project Cool",但是当时对公开场合是保密的),并且改名为ASP+。而且为ASP开发人员提供了相应的迁移策略。ASP+首次的Beta版本以及应用在PDC 2000中亮相,由Bill Gates主讲Keynote(即关键技术的概览),由富士通公司展示使用COBOL语言撰写ASP+应用程序,并且宣布它可以使用Visual Basic .NET、C#、Perl、Nemerle与Python语言(后两者由ActiveState公司开发的互通工具支持)来开发。
在2000年第二季时,微软正式推动.NET策略,ASP+也顺理成章的改名为ASP .NET,经过四年的开发,第一个版本的ASP .NET在2002年1月5日亮相(和.NET Framework1.0),Scott Guthrie也成为ASP .NET的产品经理(后来Scott Gu主导开发了数个微软产品,如:ASP .NET AJAX、Silverlight、SignalR以及ASP .NET MVC)。
自.NET 1.0之后的每次.NET Framework的新版本发布,都会给ASP .NET带来新的特性。

开发工具 编辑

ASP .NET的网站或应用程序通常使用 Microsoft(微软)公司的IDE(集成开发环境)产品Visual Studio进行开发。
在开发过程中可以进行WYSIWYG(What You See Is What You Get ,所见即为所得)的编辑。
其它开发工具:

语言支持 编辑

ASP .NET开发的首选语言是C#及VB .NET,同时也支持多种语言的开发。
语言支持软件说明
C# 微软官方支持
VB .NET 微软官方支持
F# 插件形式支持
Powershell 插件形式支持
Java/J#J#微软官方支持
PythonIronPython开源项目支持
RubyIronRuby开源项目支持
Delphi 第三方公司支持
JScript
JScript
官方支持
LuaNua开源项目支持

跨平台性 编辑

因为ASP .NET是基于通用语言的编译运行的程序,其实现完全依赖于虚拟机,所以它拥有跨平台性,ASP .NET构建的应用程序可以运行在几乎全部的平台上。
其中大致分为以微软.NET Framework为基础使用IIS做为Web 服务器承载的微软体系,以及使用Mono为基础框架运行在Windows或Linux上的开源体系。

简单易学 编辑

asp.net使运行一些很平常的任务如表单的提交客户端的身份验证、分布系统和网站配置变得非常简单。例如asp.net页面构架允许你建立你自己的用户分界面,使其不同于常见的VB-Like运算。

可管理性 编辑

asp.net使用一种字符基础的,分级的配置系统,虚拟服务器环境和应用程序的设置更加简单。因为配置信息都保存在简单文本中,新的设置有可能都不需要启动本地的管理员工具就可以实现。这种被称为"Zero Local Administration"的哲学观念使asp.net的基于应用的开发更加具体和快捷。一个asp.net的应用程序在一台服务器系统的安装只需要简单的拷贝一些必须的文件,不需要系统的重新启动,一切就是这么简单。多处理器环境的可靠性asp.net已经被刻意设计成为一种可以用于多处理器的开发工具,它在多处理器的环境下用特殊的无缝连接技术,将很大的提高运行速度。即使你现在的asp.net应用软件是为一个处理器开发的,将来多处理器运行时不需要任何改变都能提高他们的效能,但现在的ASP却做不到这一点。自定义性和可扩展性asp.net设计时考虑了让网站开发人员可以在自己的代码中自己定义"plug-in"的模块。这与原来的包含关系不同,asp.net可以加入自己定义的任何组件。网站程序的开发从来没有这么简单过。安全性基于Windows认证技术和每应用程序配置,你可以确保你的原程序是绝对安全的。asp.net的语法在很大程度上与 ASP 兼容,同时它还提供一种新的编程模型和结构,可生成伸缩性和稳定性更好的应用程序,并提供更好的安全保护。可以通过在现有 ASP 应用程序中逐渐添加asp.net功能,随时增强 ASP 应用程序的功能。asp.net是一个已编译的、基于 .NET 的环境,把基于通用语言的程序在服务器上运行。将程序在服务器端首次运行时进行编译,比ASP即时解释程序速度上要快很多.而且是可以用任何与 .NET 兼容的语言(包括Visual Basic .NET、C# 和 JScript .NET.)创作应用程序。另外,任何asp.net应用程序都可以使用整个 .NET Framework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。asp.net可以无缝地与 WYSIWYG HTML编辑器和其他编程工具(包括Microsoft Visual Studio .NET)一起工作。这不仅使得 Web 开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到 Web 页的 GUI 和完全集成的调试支持。 当创建asp.net应用程序时,开发人员可以使用 Web窗体或 XML Web services,或以他们认为合适的任何方式进行组合。每个功能都能得到同一结构的支持,使您能够使用身份验证方案,缓存经常使用的数据,或者对应用程序的配置进行自定义. 如果你从来没有开发过网站程序,那么这不适合你,你应该至少掌握一些HTML语言和简单的Web开发术语(不过我相信如果有兴趣的话是可以很快的掌握的)。你不需要先前的ASP开发经验(当然有经验更好),但是你必须了解交互式Web程序开发的概念,包含窗体,脚本,和数据接口的概念,如果你具备了这些条件的话,那么你就可以在asp.net的世界开始展翅高飞了。

Web服务器 编辑

ASP .NET不能只被看做是 Active Server Page (ASP) 的下一个版本,而且是一种建立在通用语言上的优秀程序构架,而且可以运行于多种平台的WebServer之上。

开发环境

Cassini/CassiniDev
Cassini 是一个开源项目。是一个独立的ASP .NET运行环境。
WebServer
Visual Studio 自带的Web Server也可以运行ASP .NET应用,Web Server是为了方便开发者快速启动及调试网站的产品,后期被IIS Express取代。
IIS Express
IIS Express被集成到了Visual Studio及WebMatrix之中,方便用户以“集成模式”来调试ASP .NET应用程序。

生产环境

IIS
IIS指 Internet Information Services(因特网信息服务)。IIS 是 Windows 系统的捆绑的免费组件。
经典的Web应用程序承载应用,可以通过在Windows下使用.NET或者在其它操作系统中使用Mono来使ASP .NET应用程序运行起来。
XSP[1]
XSP 是一个有着独立标准的 web server,它使用C# 编写,可以用来运行ASP .NET应用程序。XSP 可以在 Mono 以及 Microsoft .NET运行时之下正常工作。
  
Nginx
Nginx是一个高性能的 HTTP 服务www tube8 com videos程序,它支持ASP .NET 以及 ASP .NET MVC Web 应用程序,通过FastCGI。
Jexus
Jexus是一款基于dotNET/Mono环境,直接支持ASP.NET的免费的WEB服务器系统。

处理架构 编辑

asp.net运行的架构分为几个阶段:
在 IIS 与 Web 服务器中的消息流动阶段。 在asp.net网页中的消息分派。 在asp.net网页中的消息处理。

消息流动 编辑

当装载(hosting)asp.net的 Web 服务器接收到 HTTP 要求时,HTTP 聆听程序 (HTTP Listener) 会将要求转交给 URL 指定的网站应用程序的工作流程 (Worker www tube8 com videos Process),asp.net的工作流程处理器 (aspnet_isapi.dll,若是 IIS 5.0 时则是 aspnet_wp.exe) 会解析 URL,并激活位于 System.Web.Hosting 命名空间中的 ISAPIRuntime(视版本)对象,接收 HTTP 要求,并调用 HttpRuntime,运行 HttpRuntime.ProcessRequest(),在 ProcessRequest() 中使用 HttpApplicationFactory 建立新的 HttpApplication (或是指定的 IHttpHandler 处理器),再分派给 Page 中的 ProcessRequest() 或是 IHttpHandler 的 ProcessRequest() 方法,运行之后,再传回到 ISAPIRuntime,以及 aspnet_isapi.dll,最后交由 HTTP Listener 回传给用户端,因为运行程序有如管线般顺畅的运行,因此称为HTTP Pipeline Mode
在asp.net内部的 HTTP 处理器有:
ISAPIRuntime:由 aspnet_isapi.dll 调用,初始化 HttpWorkerRequest 对象(会由IIS的版本决定要初始化的版本)。 HttpRuntime:提供要求队列 (Request Queue)、调用 HttpWorkerRequest www tube8 com videos 中的 ProcessRequest() 方法,以及后续的处理工作。 HttpWorkerRequest:产生 HttpApplication、HttpRequest、HttpResponse 等基础对象的 HTTP 要求对象,并将要求转送到要处理的对象(并调用它的 ProcessRequest() 方法)。 IHttpHandler 与 IHttpAsyncHandler:负责处理 HTTP 要求的单元,由 ProcessRequest() 来分派与运行要求。asp.net网页中的事件程序  当 HttpWorkerRequest 调用asp.net网页(System.Web.UI 命名空间的 Page 类) 的 Page.ProcessRequest() 方法时,它会依序的引发 Page 内的各个事件,并同时调用在 Page 中所有控件的相关事件,其引发顺序为:
PreInit 事件:运行预先初始化的工作,在asp.net2.0中,若要动态调整主版页面 (Master Page)、布景主题 (Theme) 时,要在这个事件中调整。 Init 事件:运行初始化工作。 InitCompleted 事件:在完成初始化工作后引发。 Preload 事件:运行预先加载的工作。 Load 事件:运行加载的工作,大多数的网页都拥有 Page_Load 事件处理程序,用户控件 (user control) 中也有 Page_Load 事件例程,都会在此时调用。 控件的 PostBack 变更通知:当网页侦测到是 PostBack 要求时,会引发 PostBack 消息通知的事件。 控件的 PostBack 相关事件:当网页侦测到是 PostBack 要求时,会引发 PostBack 消息指定的控件的事件。 LoadCompleted 事件:运行加载完成后的工作。 PreRender 事件:处理在产生 HTML 结果前的工作。 SaveStateCompleted 事件:处理页面状态 (ViewState 与 ControlState) 储存完成后的事件。 Render 事件:处理产生 HTML 的工作。 Unload 事件:处理退出网页处理时的工作。 如果 HttpWorkerRequest 调用的是实现 IHttpHandler 界面的HTTP 处理程序时,它只会调用 IHttpHandler.ProcessRequest() 方法,由它来处理程序的输出,不像 Page.ProcessRequest() 会处理事件顺序,因此 HTTP Handler 很适合轻量级的数据处理,像是输出文件数据流或是图片数据流等。

事件模型 编辑

asp.net的原始设计构想,就是要让开发人员能够像 VB 开发工具那样,可以使用事件驱动式程序开发模式 (Event-Driven Programming Model) 的方法来开发网页与应用程序,若要以ASP技术来做到这件事的话,用必须要使用大量的辅助信息,像是查询字符串或是窗体字段数据来识别与判断对象的来源、事件流向以及调用的函数等等,需要撰写的代码量相当的多,但asp.net很巧妙利用窗体字段和JavaScript脚本把事件的传递模型隐藏起来了。
asp.net的事件模型是由以及数个 Hidden Field 组合而成,基于 HTTP 模型的限制,所有的网页程序在运行结果输出到用户端后,程序就会退出运行,为了维护在asp.net网页与控件的状态数据,因此在输出asp.net控件时,asp.net会将部份状态数据储存到网页的 Hidden Field 中,这类型的状态数据称为 ViewState(ID 为 __VIEWSTATE),在服务器端即会被解译出状态与事件数据。在大多数的内置 Web 控件中都有使用到这个机制,因此在使用大量asp.netWeb 控件的网页中,会有许多的 ViewState 会存放在网页中并随着 HTTP 数据流输出到用户端,ViewState 在输出时,会被加密为一组乱码字符串,其金钥值定义在计算机中,并且每一个对象都会被序列化 (serialize) 成字符串(因此若是自定义对象要放到 ViewState 时,则应要让它支持序列化),再输出到 __VIEWSTATE 字段中,在每次的网页来回时都会被传输,较大的 ViewState 会让网页大小膨胀,不利于快速的网络传输,不过asp.net本身有提供将 ViewState 关闭的功能,因此如果控件不需要状态保存时,可将它关闭以减少输出的大小。
为确保控件的事件能够确实被引发,让事件驱动能够被运行,因此控件事件引发命令时需要的参数,是交由 JavaScript 脚本在用户端引发时,填入另一个 Hidden Field(ID 为 __EVENTTARGET 以及 __EVENTARGUMENT),并且引发窗体的送出指示 (submit),传送到服务端后,服务端的 HttpApplication 中的工具函数会解析 __EVENTTARGET 和 __EVENTARGUMENT 字段中的信息,并且交由控件所实现的 RaisePostBackEvent() 来引发事件,并由 .NET Framework 内部的事件处理器接手处理(调用控件设置的事件处理程序)。

来回模式 编辑

在asp.net运行的时候,经常会有网页的来回动作 (round-trip),在asp.net中称为 PostBack,在传统的 ASP 技术上,判断网页的来回是需要由开发人员自行撰写,到了asp.net时,开发人员可以用 Page.IsPostBack 机能来判断是否为第一次运行 (当asp.net发现 HTTP POST 要求的数据是空值时),它可以保证asp.net的控件事件只会运行一次,但是它有个缺点(基于 HTTP POST 本身的缺陷),就是若用户使用浏览器的刷新功能 (按 F5 或刷新的按钮) 刷新网页时,最后一次运行的事件会再被运行一次,若要避免这个状况,必须要强迫浏览器清空高速缓存才可以。
asp.net2.0 中有新增三个来回模式
Cross Page Postback:允许跨不同的网页运行 PostBack,服务端可使用 Page.IsCrossPostBack 来判断是否是跨网页型的来回。 Async Page Mode:允许网页使用异步的方式运行,服务端可用 Page.IsAsync 来判断。 Callback:asp.net2.0 新增的由网页回呼用户端指令的功能,服务端可用 Page.IsCallback 来判断是否要求是来自 Callback。
来回模式不仅是asp.net运作时的内核
它也是asp.net应用程序的一个主要缺点,尤其是在设计复杂度高的页面时,在网页中隐藏的 ViewState 的大小会相当大,而在每次的来回动作中,都会传送 ViewState 在内的窗体信息,大量的 ViewState 会使得传送的时间拉长,而且每次来回动作都会让整个网页被刷新,而出现闪烁的情况(就算在本地端也一样),但在AJAX技术尚未成熟时,只能够忍受这种因底层限制所带来的问题,在asp.netAJAX技术发展出来后,通过UpdatePanel成功的缓解了这个问题(但 ViewState 传送的问题仍然未根本的解决,必须要使用像 Page Method 这样的方式才能彻底的解决)。

绘制技术 编辑

熟悉 ASP 技术的人都知道,代码都是混在 HTML 标签之间,以输出预期需要的 HTML 指令,这个技术在asp.net中,由各控件的绘制 (Render) 机制包装起来了,绘制机制装载了 HtmlTextWriter 对象,由它来产生 HTML 指令,它会输出至 HttpContext 的 Response 输出数据流中 (即 ASP 技术的 Response.Write())。

状态管理 编辑

状态管理 (state management) 在Web应用程序中,一向是很重要的课题,良好的状态管理可以帮助开发人员发展出具有状态持续能力的应用程序(像是工作流程型应用程序或是电子商务应用程序),但状态管理功能会视应用程序的部署状态以及信息的共用程度来选择,在asp.net中,分为服务器端状态管理以及用户端状态管理,用户端状态管理为ViewState以及Cookies,服务端状态管理则是Session与Application对象。它们的差异点在于:
ViewState 是加密的数据流,和 HTML 一起输出到用户端。 Cookies 是加密(也可不加密)的小型数据,和 HTML 不同,它可以高速缓存在用户端浏览器中。 Session 是服务器端的状态保存机制,每个用户端均有独立的空间(以浏览器运行个体来赋与唯一的SessionID值)。 Application 是服务器端的状态保存机制,但应用程序所有的用户端共用同一份状态数据。

层级对象 编辑

Application 对象会在应用程序的 Application_OnStart 事件中初始化,并使用名称来识别数据(它是一个 NameObjectCollectionBase 集合的实现品),它会储存在应用程序的范围内,所有的连接(用户)都可以使用,属于共用型的储存体,适合储存所有用户都可使用的数据,在多人使用的情况下,可以适当的使用 Lock/Unlock 的机制来确保应用程序状态的更新。
Application.Lock();Application["PageRequestCount"] = ((int)Application["PageRequestCount"])+1;Application.UnLock();

连接层级 编辑

连接层级的对象是 Session,以浏览器的运行个体为识别单位,数据依浏览器的运行个体来储存,在浏览器的运行个体第一次连到应用程序时,asp.net会设置一个 Session ID,并且使用它来识别 Session,每一个 Session 都是 ICollection 与 IEnumerate 的实现,用 key 来识别数据值,并且具有时间的限制 (timeout),若超出时限时服务器会自动清理掉,默认的 Session 时限为 20 分钟。Session ID 的算法是由 RNGCryptoServiceProvider (密码编译乱数产生器提供者)产生,并编码成一个 Session ID 字符串(例如 anf4vuup3xiq0arjlqla2l55 这样的字符串)储存在服务器中,用以识别不同的 Session 个体。
为因应不同的用户端,asp.net设计了不同的 Session ID 存放机制,像是旧式的浏览器或是行动用户端这种不支持本地储存cookie的设备时,asp.net可以直接在 URL 中加上 Session ID 的识别,像是 http://www.acme.com.tw/(anf4vuup3xiq0arjlqla2l55)/profile.aspx 这样的 URL,可以由开发人员自行设置,或是使用 AutoDetect 设置来让asp.net自行判断要使用的 Session ID 存放方式。
Session ID 的产生方法可以由程序开发人员自定义,借由改写 SessionIDManager 的 CreateSessionID() 方法来自定义。
usingSystem;
usingSystem.Configuration;
usingSystem.Web.Configuration;
usingSystem.Web;
usingSystem.Web.SessionState;
namespaceSamples.AspNet.Session{
publicclassGuidSessionIDManager:SessionIDManager{
publicoverridestringCreateSessionID(HttpContextcontext){
returnGuid.NewGuid().ToString();
}
publicoverrideboolValidate(stringid){
try{
GuidtestGuid=newGuid(id);
if(id==testGuid.ToString())returntrue;
}
catch(Exceptionex){}
finally{}
returnfalse;
}
}
}
[2]

跨机器 编辑

状态管理在单一服务器上,可以储存在服务器的存储器中,但若是在大型网站中,使用许多的 Web 服务器来实行负载平衡(Load Balancing)处理时,会有状态储存在哪个位置的问题,因此需要有一个可以在每个 Web 服务器之间做状态储存的媒介,像是独立的服务器或是数据库等等。在asp.net中支持了四种状态储存的媒介:
InProc:储存与asp.net相同的运行进程中 (in-procedure state),适合单一服务器的状态储存。 StateServer:储存在asp.net状态服务器 (state server) 中,适合跨服务器的状态储存,但因为它使用的通讯端口,因此在使用上需要注意防火墙的问题。 SQLServer:储存在独立的 SQL Server 数据库中,适合跨服务器的状态储存。 Custom:以自行实现的状态提供者 (state provider)。

部件 编辑

asp.net是开发 Web 应用程序的基础架构 (framework),除了它内部的运作方法外,对外也显露了许多的开发支持,让开发人员可以利用它来发展出许多强大的 Web 应用程序解决方案。

基础部件 编辑

asp.net最基础的底层为网页 (Page),网页由 System.Web.UI.Page 类来提供基础支持,包含了页面的事件以及对象绘制的引发点(Page 类本身是一个 HTTP Handler 的实现品)。asp.net网页在微软的官方名称中,称为 Web Form,除了是要和Windows Forms作分别以外,同时也明白的刻划出了它的主要功能:“让开发人员能够像开发 Windows Forms 一样的方法来发展 Web 网页”。因此asp.netPage 所要提供的功能就需要类似 Windows Forms 的窗体,每个 Web Form 都要有一个区块,所有的asp.net服务器控件都要放在这个区域中,这样才可以让 ViewState 等服务器控制能够顺畅的运作。
使用代码后置模式的设置时,可以让asp.net运行引擎在加载网页时,由代码后置参数取得对应的类信息,藉以使用 Reflection 的方式来运行后置的代码。
asp.net可以支持HTML和XHTML两种网页内容,但在Visual Studio.NET中,默认是使用 HTML,但在Visual Studio 2005以后的版本,则一律都改用XHTML格式。

控件 编辑

asp net的控件分为内置和外置两种。asp net的内置控件分为两种:HTML 控件 (HTML control)和用户控件 (User control)。外置控件,在使用前,需要将其添加到Visual Studio .NET环境中。然后就可以通过启动一个新项目来使用新的控件。

HTML 控件 (HTML control)

直接在 HTML 标记中加上 runat="server",即可对应到asp net指定的 HTML 服务器控件类,像是: HtmlAnchor:表示 HTML 的 Web 控件 (Web control):由asp net提供,比 HTML 控件提供更多的功能,但操作与设置会比 HTML 控件要复杂许多,像是: LinkButton:一种外型为链接 HtmlButton:表示 HTML 的 。 HtmlImage:表示 HTML 的 。 HtmlGenericControl:表示没有对应到服务器控件的对象,都会被对应到这个类。 Web 控件 (Web control):由asp net提供,比 HTML 控件提供更多的功能,但操作与设置会比 HTML 控件要复杂许多,像是: LinkButton:一种外型为链接 (除了内置的控件之外,asp net也提供了可以自定义的控件架构,并且支持两种控件开发方法。

用户控件 (User control)

以 .ascx 为扩展名,可以让开发人员用最轻松的方式来开发控件,优点是开发速度很快,但缺点是无法转散布,且无法加入参考。 自定义控件 (Custom control),可转散布型的控件,是经过编译后的代码 (DLL),可单独转散布,并且可在其他的项目加入参考引用,自定义控件有三种开发模式: 基础控件 (General Control):由 System.Web.UI.Control 类继承而来,或是由现有的 Web 控件继承而来,像是由 Button 控件继承。 复合控件 (Composite Control):由 System.Web.UI.WebControls.CompositeControl 继承而来,可以用复合的方式来开发控件。 样板控件 (Template Control):可以在控件中使用样板 (template),并套用数据到样板中,支持数据绑定的表达式。在ASP.NET里,要创建自己的控件分为两类情况。一类是“从头实现”控件的底层功能,编写一个类继承自control,并实现INamingContainer接口,甚至重写控件的Render方法,控制控件生成的HTML代码,以及实现响应从浏览器传回数据(postback)的事件和处理传回的数据。这类控件名为“自定义控件”(custom control)或“复合控件”(composite control)。与此相对比较简单的是第二类“用户控件”(user control),它只需像创建一个ASP.NET页面一样在设计器里拖拉系统控件设计界面,然后为这些控件添加必需的事件代码。这两类控件,从面向对象编程的扩展新功能来说,前者应用的是继承(也可以在继承的控件类里组合现成的控件,但出发点是继承),后者则纯粹只是组合。[1]

外置控件部署

虽然有的时候,控件在开发机器上运行正常,但当程序被部署到终端用户机器上时,会出现问题。因为很多终端机器不允许安装外置控件,对于上述问题有简单实用的解决办法-“在服务器上部署 “fp_client” 文件夹”。
fp_client 文件夹包含所有ASPNET外置控件需要的脚本文件。 拿Spread控件为例,Web 页面上的 Spread 控件实例从服务器上的 fp_client 文件夹中读取前台格式化、样式和脚本功能。
  fp_client 文件夹的默认安装路径是:C:\Program Files\GrapeCity\Spread.ASP.5.dotNet20\v5.0.2015\fp_client\fpspread\5_0_2015_2008\HTC
我们需要在 web.config 文件中添加以下代码 fp_client 文件夹进行正确的加载:



下面是两个有助于我们更加深入的去解决该问题问题的相关点:
  1.上面的标签仅在你想要从程序根目录下载“fp_client”文件夹是需要 ,在这种情况下,你需要复制 fp_client 文件夹并且把它粘帖到程序的根目录下,或者创建一个映射到 fp_client 文件夹的虚拟路径。
  2.在服务器上有很多网址运行 Spread for ASPNET,我们仅需要把 fp_client 文件夹 复制到服务器的根目录上即可(而不是程序的根目录)。在这种情形下, 上述 web.config 标签是不需要添加的,程序仍然可以完美运行。[3]

控件属性

1、ClientIDMode
渲染ASP NET控件时会自动生成一个ID,当在客户端脚本中引用它们时,却会制造不少麻烦,虽然它是命名容器和ID的简单串联,但仍然无法预测生成的ID范围.
ASP NET 4.0使用ClientIDMode属性解决了这个问题,它允许控制生成这些ID的方法,ClientIDMode有四个可选择的值:AutoID,Static,Predictable和Inherit.下面是这四个值的含义解释:
AutoID – 和4.0以前的版本保持一致,自动生成ID.
Static – 指定ID的值,在渲染控件时不会发生变化.
Predictable – 指定后缀,然后和容器控件的ID属性进行合并.
Inherit – 继承父控件的设置.
注意,Page的默认ClientIDMode属性的值是AutoID,可以通过@ Page指令设置页面级的值,还可以通过修改Web配置文件设置应用程序级的值.
[pre]
[/pre]
2、Meta关键字和Meta描述
在ASP NET 4.0中Page类增加了两个新的属性:Meta Keywords和Meta Description,可以在运行时设置这两个属性,通过数据库或其它源驱动,并允许动态设置标签,描述特定的页面,下面的Page标签显示了这两个属性.
[pre]
<%@PageLanguage=
"C#"AutoEventWireup=
"true"Keywords=
"keyword1,keyword2"Description=
"mydescription"%>"C#"
AutoEventWireup=
"true"
Keywords=
"keyword1,keyword2"
Description=
"mydescription"
%>"C#"
AutoEventWireup=
"true"
Keywords=
"keyword1,keyword2"
Description=
"mydescription"
%>[/pre]
3、数据绑定控件中的行持久性选择
ASP NET数据绑定控件,如Grid View,都支持行选择,但它们应该选择每个页面上相同编号的行,但ASP NET 4.0以前的版本中,行持久性选择是不能实现的,因为以前的版本选择后续页面上的行时是基于行索引的,ASP NET 4.0提供了一个直观的方法解决了这一问题.
数据绑定控件现在提供了一个EnablePersistedSection属性,它可以帮助实现行持久性选择。
4、AutoEventWireup
AutoEventWireup是很少使用但知名度很高的一个ASP NET属性,简单地说,它设置为True时,在未明确委派的情况下,允许自动调用页面事件。
它的默认值是True,AutoEventWireup属性的缺点在MSDN上有详细描述:"它限制了命名事件处理程序的灵活性,另一个缺点是对性能的不利影响,对于高流量的网站,性能影响是巨大的".
5、Page的Header属性
Page类现在提供了Header属性,可以在运行时绑定它,下面的代码示例显示了如何明确设置Title属性.
this.Header.Title = "My page title";
当根据某个规则动态关联一个样式表时,这个属性非常方便,在这种情况下,打印页面是理想的候选.
[pre]
HtmlLinkprintLink=newHtmlLink();
printLink.Attributes.Add("type","text/css");
printLink.Attributes.Add("rel","stylesheet");
printLink.Attributes.Add("href","css/print.css");
this
.Header.Controls.Add(printLink);
[/pre]
6、AssociatedControlID属性
可以在一个Web表单中将一个控件关联到另一个服务器控件,这时需要使用服务器控件的AssociatedControlID属性,当根据某些行为为关联的控件设置热键时,这个属性就可以派上用场了.
AssociatedControlID属性的默认值是一个空字符串,它表示控件未与任何服务器控件关联,下面的代码显示了一个Textbox控件是如何与Label服务器控件关联的.
7、ControlState属性
ASP NET最重要的状态管理技术是ViewState,它允许你在往返Web服务器的路上保留值,但由于可在父级关闭,它并不是保存信息可靠的方法.
ASP NET 2.0为服务器控件引入了私有的ViewState,叫做ControlState,它可用来存储控件的关键信息,ASP NET可以处理它的序列化和反序列化.
注意,使用时必须谨慎,因为它会影响页面的性能.
8、Control.PreserveProperty
针对传统的视图状态用法,Rick Strahl为我们提供了另一个选择:PreservedProperties,它可以保存控件ID和属性名称,详细信息请参考"Implementing an ASP NET PreserveProperty Control(实现ASP NET PreserveProperty控件)".
9、PreviousPageType指令
PreviousPageType指令是ASP NET 2.0跨页面回送机制的一部分,允许指定来源页面的虚拟路径,以便强类型访问来源页面.正常情况下,发送的数据可通过PreviousPage属性和FindControl方法访问,但使用强类型的PreviousPageType指令允许你访问公共属性,而不需要调用FindControl方法.

脚本 编辑

asp.net的 Web 控件有时会包装一些用户端脚本 (client-side scripting),在控件被绘制时输出到用户端,这些脚本多数被包装在 DLL 的资源档中,并由 ScriptResource.axd 处理程序来输出,开发人员也可以利用 ClientScriptManager (Page.ClientScript 属性) 中的方法来添加脚本到网页程序中,常用的方法有:
ClientScriptManager.RegisterClientScriptBlock():注册用户端脚本区块 (script block)。 ClientScriptManager.RegisterStartupScript():注册在起始时运行的脚本。 ClientScriptManager.RegisterOnSubmitStatement():注册在处理窗体发送时要运行的脚本。 ClientScriptManager.RegisterClientScriptInclude():注册由外部文件 (.js) 提供的脚本来源。

基本对象 编辑

以往在 ASP 中常被使用的五大基本对象,在asp.net中仍然持续被支持,但它们都换了一个身份来提供:
Application:包装了 HttpApplication 对象,在程序中使用 Application 指令取得的对象,都是来自于 HttpContext.Current.Application 属性回传而得。 Request:包装了 HttpRequest 对象,在程序中使用 Request 指令取得的对象,都是来自于 HttpContext.Current.Request 属性回传而得。 Response:包装了 HttpResponse 对象,在程序中使用 Response 指令取得的对象,都是来自于 HttpContext.Current.Response 属性回传而得。 Session:包装了 HttpSessionState 对象,在程序中使用 Session 指令取得的对象,都是来自于 HttpContext.Current.Session 属性回传而得。 Server:包装了 HttpServerUtility 对象,在程序中使用 Server 指令取得的对象,都是来自于 HttpContext.Current.Server 属性回传而得。

导览部件 编辑

导览部件 (navigation controls)
菜单 (Menu):提供内置的鼠标侦测方式,实现层次结构式的菜单功能。 网站地图 (Sitemap):提供可层次化目前浏览位置的功能,可支持由 Web.sitemap 中的数据,或是来自数据库或 XML 数据档中的数据来源。 树状查看 (TreeView):提供层次结构化的数据浏览,类似于资源管理器的界面。

程序服务 编辑

应用程序服务(application services) 是在asp.net2.0 中才开始提供,它以 Provider-based Pattern 为主,实现出数个网站的常用服务,包含会员服务 (Membership Service)、角色服务 (role service)与设置档服务 (profile service) 等。
会员服务由 Membership 以及其数据提供者 MembershipProvider 构成,应用程序使用 Membership 所显露的方法来操作,它会将要求转送给指定的 MembershipProvider 实现来处理,asp.net目前支持来自于数据库的 SqlMembershipProvider (支持 SQL Server) 以及来自于活动目录的 ActiveDirectoryMembershipProvider,开发人员也可以自行由 MembershipProvider 继承来实现自定义的会员服务数据提供者。
角色服务与会员服务类似,由 Role 以及其数据提供者 RoleProvider 构成,应用程序使用 Role 所显露的方法操作,由 RoleProvider 实现提供数据服务,目前内置的 RoleProvider 有来自 活动目录 或 XML 文件的 AuthorizationStoreRoleProvider,由 SQL Server 供应数据的 SqlRoleProvider,以及支持 Windows 角色的 WindowsTokenRoleProvider 三种,开发人员可自行实现 RoleProvider 的方法以发展出自定义的角色服务提供者。
设置档服务是一个特殊的服务,它结合了 .NET Framework 的 CodeDOM 开发模式,以及 System.Web.Profile 命名空间的 ProfileBase、ProfileInfo 与 ProfileManager 等类,组合出完整的设置档支持,其数据来源也是以 Provider-based Pattern 为主,由 ProfileProvider 提供,asp.net内置由 SQL Server 数据库建立的 SqlProfileProvider,其字段系由开发人员在asp.net组态档中自行定义,再由asp.net动态产生强型别的字段属性。
设置档服务也是作为asp.net2.0 的网页组件(Web Part Framework) 所需要的设置档储存支持,Web Part Framework 可以让开发人员可以开发出具备个人化能力 (Personalization) 的网页配置方案,让用户可以用自行新增与拖放的方式来设计自己的网页布置,所需要的设置储存即由设置档服务处理。
另一个需要和应用程序服务配合使用的功能为 Web 事件架构 (Web Event Framework),它需要由应用程序服务提供数据结构,它也有 Provider-based Pattern,并可以支持数种的事件数据提供者。
ASP.NET获取网站访问人数的方法
1.新建网站,在网站的全局应用程序类中的Application_Start()方法中将网站的访问人数记录到静态变量中,代码如下:[4]
publicstaticint_totalcount;
voidApplication_Start(objectsender,EventArgse)
{
//在应用程序启动时运行的代码
_totalcount=0;
}
2.在全局应用类中的session_Start()方法中,讲记录访问人数累加1:
voidSession_Start(objectsender,EventArgse)
{
//在新会话启动时运行的代码
Application.Lock();
_totalcount++;
Application.UnLock();
}

延展性 编辑

除了asp.net网页以外,.NET Framework 还提供了两种可以由开发人员自行发展处理模型的模块,一种是HTTP Handler,另一种则是HTTP Module。
HTTP Handler (扩展名为 .ashx) 由 System.Web.IHttpHandler 接口定义了必要的方法(可支持异步的 HTTP Handler 称为 HTTP Async Handler,由 System.Web.IHttpAsyncHandler 界面定义),其中最重要的方法是 ProcessRequest() 方法,开发人员必须要实现这个方法,才能够让 HTTP Handler 有作用,它也可以通过asp.net的组态设置,让 HTTP Handler 可以处理特定的扩展名,它可以被视为 .NET Framework 中的 ISAPI Extensions 实现方法。
HTTP Module 则是由 System.Web.IHttpModule 接口定义,它可以在整个网页生命周期中被调用多次,并实际处理由 HttpApplication 所引发的事件,开发人员需要实现 IHttpModule.Init() 方法,以及处理 HttpApplication 事件需要的代码。它可被视为 .NET Framework 中的 ISAPI Filter 实现方法。

一致性 编辑

asp.net在一开始的时候是缺乏范本引擎 (template engine) 的,其主因是.NET Framework本身是面向对象,且需要用继承的方式才能够延伸功能,大多数的开发人员都是由 System.Web.UI.Page 继承并定义出新的基类,并撰写要绘制 HTML 的方法,以及在他们的应用程序中修改以继承该类,然而这个方法可能会被用在网站的很多地方,因而会大大的提升混合代码与标记的复杂度,这个方法也只能在运行期才能够以可视化的方式测试,无法在设计时期可视化,其他的开发人员总是使用原有的 ASP 方法(即 指令)来把每个网页需要的部份包到网页中,防止在每个网页中都要撰写相同的导览代码。
在asp.net2.0 中,推出了主版页面 (master page)的概念,它可以让开发人员先行定义外观版型 (*.master),再使用它来套用实际运行的网页,网页与主版页面之间以 ContentPlaceHolder 的 ID 做链接,以套用正确的内容到保留区 (即由 ContentPlaceHolder 包住的区域) 中,开发人员也可以定义在保留区没有套用时需要显示的默认内容。在asp.net3.5 中更进一步的支持设计时期的嵌套主版页面 (nested master pages),以及把网页的 HEAD 区块纳入 ContentPlaceHolder 的范围。
与主版页面相关的,还有主题(Theme)以及面板(skin)技术,这两个技术允许开发人员或设计人员自行定义网页的样式设置以及套用的样式支持,每个主题中可以包含数个面板档,这些面板档决定了控件要输出时套用的样式,开发人员则可以利用主题来决定不同的外观要使用的样式。
asp.net也允许在应用程序中动态的变更主版页面与主题,但必须要在页面的 PreInit 事件例程设置。
voidPage_PreInit(Objectsender,EventArgse){Page.MasterPageFile="~/NewMaster.master";Page.Theme="MyTheme";}

编译模型 编辑

asp.net在 1.x 时,使用的是组件为主的编译方式,一个网页只会产生一个组件,这个方式最大的优点,就是可以自由定义命名空间,且在部署应用程序时会比较方便,但由于asp.net1.x 所处的时代,如果网站是有许多代码的情况下(即 DLL 档很大),加载的速度会变慢,且占用存储器的量会很多,当时的存储器价格也尚未降到现在的水平。因此在asp.net2.0 开始,另外提供了一个预先编译(Pre-compilation) 的编译模型,这个编译方法会将每个网页都各自编译成一个组件,其文件名称会是 App_[乱数字符串].dll 命名,在编译时期由asp.netPre-compilation 工具 (aspnet_compiler.exe) 给定,优点是可以不必加载过量的代码到存储器中,但缺点则是无法自定义命名空间,而且在更新时必须要更新所有的 DLL 档以及网页等,否则会造成名称不一致,让 DLL 无法被加载的问题。
早期asp.net2.0 仅提供预先编译模式,让它的缺点很快的被暴露出来,因此微软也为asp.net2.0 开发了沿用asp.net1.x 的编译模型的工具:Web Application Project,在 Visual Studio 2008 中开始内置,至此,asp.net支持两种编译模式的架构抵定。

安全支持 编辑

验证

asp.net的验证方式有三种:
Windows 验证:由 IIS 目前运行的帐户,或者是用户模拟 (user impersonate) 帐户的方式进行验证。 窗体验证:由窗体的数据提供验证,开发人员自定义验证逻辑,并交由asp.net窗体验证工具写入验证凭证,以进行授权。 Passport 验证:在asp.net1.x 中,连接Windows Live ID (当时的旧称为Microsoft Passport) 服务以进行验证。

授权

asp.net的授权方式有两种:
文件授权:由asp.net检查文件的 访问控制表 (ACL) 来授权访问权限。 URL授权:由开发人员设置的 URL 来给予权限。

WS支持 编辑

asp.net1.0 开始支持 Web Service 的开发,是微软在本地平台上支持 Web Service 发展的第一个实现品,但它却不是微软的第一个 Web Service 开发工具实现品,.NET Framework 中提供了一个 WSDL.exe,可以连接 Web Service 下载WSDL定义档,并产生一个 Proxy Class 的源代码,供用户端应用程序使用,若是使用 Visual Studio 开发的话,这个动作会由“加入 Web 参考”的动作在背后处理掉。
asp.netWeb Service 的发展只是平台的基础,微软在 Web Service 的开发上提供持续的支持,尤其是在 WS-I (Web Service Interoperability) 组织成立后,为符合 WS-I 的 Web Service 标准,微软开发了强化 Web Service 的增强包 Web Service Enhancement (WSE),最新版本为 3.0 版(搭配asp.net2.0),可支持许多 WS-I 的标准。
由于 Windows Communication Foundation 的推出,微软将 Web Service 的发展重心移到 WCF 上,原有的asp.netWeb Service 即给定了一个名称:ASMX Web Service。

扩充功能 编辑

asp.net在 2.0 版时,功能已大致底定,成为 Web 应用程序的基础架构,微软开始在asp.net2.0 上开发扩充的功能,包括 AJAX 的支持、MVC架构的支持以及更容易开发出数据库应用的架构。
ASP.NET ASP.NET

执行效率 编辑

asp.net是把基于通用语言的程序在服务器IIS上运行。不像以前的ASP即时解释程序,而是将程序在服务器端首次运行时进行编译,这样的执行效果,当然比一条一条的解释强很多。但是asp.net也有一个特点,就是每修改一次程序(即代码类)必须重新编译一次,修改几次就必须重新编译几次,执行效果也会有所降低。

相关课程 编辑

asp.net2.0 快速入门
asp.net2.0安全系列课程
asp.net2.0入门与提高系列课程
asp.net3.0
asp.net3.5开发系列课程
asp.netAJAX深入浅出系列课程
asp.netMVC框架开发系列课程
asp.net开发实践
asp.net新特性

安装 编辑

在Windows Server 2003系统服务器上安装asp.net的方法如下:
第1步,打开Windows Server 2003(SP1)系统的“控制面板”并双击“添加或删除程序”图标,在打开的“添加和删除程序”对话框中单击左侧的“添加/删除Windows组件”按钮,打开“Windows组件向导”对话框。
第2步,在“组件”列表中找到并单击“应用程序服务器”选项,单击“详细信息”按钮。在“应用程序服务器”对话框中分别选中“子组件”列表中的asp.net复选框。依次单击“确定”→“下一步”按钮开始安装,可能会提示插入Windows Server 2003(SP1)系统安装光盘或指定安装源文件路径。
第3步,单击“完成”按钮结束安装,并关闭“添加或删除程序”对话框。

与ASP的区别 编辑

目前很多人对ASP.NET和ASP概念混淆,其实两者是不同,ASP是解释性编程框架,而ASP.NET是编译性框架;ASP.NET无论是从执行效率和安全上都远远超过ASP;ASP文件的后缀是.asp而ASP.NET则是.aspx和.aspx.cs。ASP.NET实现了代码分离,让代码管理更加直观。

子集与扩展 编辑

通常所说的ASP .NET,是指的ASP .NET WebForms。除了以控件及事件模型为核心的ASP .NET WebForms之外,ASP .NET 以支持多变的编程风格及其它扩展框架。
ASP .NET 在 2.0 版时,功能已大致底定,成为 Web 应用程序的基础架构,微软开始在 ASP .NET 2.0 上开发扩充的功能,包括 AJAX 的支持、MVC架构的支持以及更容易开发出数据库应用的架构。
  • ASP .NET MVC
  • ASP .NET AJAX(基于MicrosoftAJAX及WebForms)
  • UrlRouting
  • ASP .NET Dynamic Data Framework
  • WebApi
  • WebPages(即Razor语法的网页程序)

版本历史 编辑

ASP .NET已经历经以下版本。
日期版本帮助新功能
2002年1月16日1.0与Visual Studio .NET一起发布的第一个版本
  • 面向对象的Web应用程开发,支持继承多态与其他标准面向对象程序设计的功能。
  • 开发人员不再需要使用 Server.CreateObject(...),让早期绑定与类型安全变得可能。
  • Microsoft Windows程序设计为基础,开发人员能够使用在Web Server上使用的DLL类库来创建许多能够做到比只简单的输出 HTML 更多的鲁棒性 (robust) 应用程序(例如异常处理功能)。
2003年4月24日1.1Windows Server 2003和Visual Studio .NET 2003一起发布。
  • 移动设备控件。
  • 自动化输入验证。
2005年11月7日2.0
研发代号为Whidbey,和Visual Studio 2005、Visual Web Developer Express与SQL Server 2005一起发布。
  • 新的数据控件(GridView、FormView、DetailsView)
  • 新的声明式数据访问技术(SqlDataSource、ObjectDataSource 与 XmlDataSource 控件)
  • 导览控件(SiteMap、Menu、TreeView)
  • 主版页面 (Master Page)
  • 登录控件
  • 主题
  • 表皮 (skin)
  • Web 部件 (Web Part)
  • 个性化服务 (Profile)
  • 全功能的预先编译能力
  • 全新的当地语系化技术
  • 支持64位平台
  • 提供者类型模式
2007年11月19日3.5Visual Studio 2008Windows Server 2008一起发表
  • 新数据控件(ListView、DataPager)
  • ASP .NET AJAX内含到.NET Framework,成为.NET Framework的一部分。
  • 提供支持LINQ的 LinqDataSource 控件。
2008年8月11日3.5SP1于 Visual Studio 2008 Service Pack 1 发布
  • 内含ASP .NET Dynamic Data
  • 在 ASP .NET AJAX 应用程序中支持浏览器历史控制 (controlling browser history)。
  • 将多个JavaScript文件合并到单一文件以强化有效的下载。
2010年4月12日4.0Visual Studio 2010一起发布
  • 配合.NET Framework 4.0让Web应用程序具有如并行运算库(Parallel Library)等新功能。
  • ASP .NET MVC 2.0
  • jQuery完全集成与ASP .NET AJAXClient Library 强化,以及 AJAX CDN 的支持。
  • ASP .NET 的 Render Compatibility (3.5以前版本或4.0版),可控制许多 ASP .NET Web 控件的绘制行为,以配合标准 HTML 与 jQuery 的处理。
  • SEO的支持。
  • 自定义高速缓存提供者 (Extensible Output Cache)。
  • QueryExtender 的支持。
  • CSS 控制行为的变更。
  • 自定义的 Client ID 输出。
  • ViewState 的控制。
  • 配合 Visual Studio 2010 的 Web Deploy 工具。
  • Entity Framework 4.0 的支持。
  • Dynamic Data Framework 与 Chart Control 自带至核心中
参考资料
词条标签:
计算机术语 计算机学