逍遥一派 发表于 2015-1-16 22:37:50

ASP.NET编程:编写高功能Web使用程序的10个技能

是不是实质都是API?有的好像不只是API那么简单的,有的也是一种框架就像MFC一样。有的还是一种思想(就是做软件的思想)(好像很深奥,其实我也不懂^_^)web|程序|技能|功能RobHoward译:热带鱼
这篇文章会商了:
・一样平常ASP.NET功能的奥密
・能进步ASP.NET体现的有效的技能和秘诀
・在ASP.NET中利用数据库的倡议
・ASP.NET中的缓存和背景处置
  利用ASP.NET编写一个Web使用程序是难以相信的复杂的。太复杂了,以致于良多开辟者都不消费工夫来构建他们的使用程序来到达很好的体现。在这篇文章里,我将为编写高功能的Web使用程序保举10个技能。我不会讲我的叙述范围于ASP.NET使用程序,由于ASP.NET使用程序只是Web使用程序的一个子集罢了。这篇文章不会是针对优化Web使用程序的功能的威望性引导――一本完全的书能够很简单的做到这一点。相反,我们应当把这篇文章当做一个好的出发点。
  在成为一个事情狂之前,我会常常往攀岩。在做任何攀岩举动之前,我更乐意看看游览指南内里的线路,再读读那些已经到过峰顶的人做的保举。可是,不论游览指南写的有多好,在实验一个有应战性的方针之前,您都必要有实践的攀岩履历。与之类似,当您面对修复功能成绩大概运转一个高吞吐量站点的成绩时,您只能进修怎样编写高功能Web使用程序。
  我的团体履历来安闲微软的ASP.NET团队中担当过一位基本程序司理的履历,保护和办理www.asp.net,另有匡助构架CommunityServer,它是几个出名的ASP.NET使用程序(ASP.NETForums,.Text,和毗连到一个平台的nGallery)的下一个版本。我信任这些已经匡助过我技能中的一些也会对您有效的。
  您应当思索把您的使用程序分别为几个逻辑条理。您大概已传闻过3层(大概n层)系统布局。这些一般都是划定的布局形式,它们将营业和(或)硬件从物理长进行了功效分别。假如体系必要更年夜的范围,更多的硬件能够轻松的加出去。但是,那会发生一个与营业和呆板腾跃相干联的功能下落,因而我们应当制止它。以是只需大概,只管在统一个使用程序中运转ASP.NET页面和页面的相干组件。
  由于代码的分别和条理之间的界限,利用Web服务大概远程处置会下降功能20%乃至更多。
  数据层有点不同凡响,由于一般情形下,最好具有公用于数据库的硬件。但是,但是历程腾跃到数据库的本钱仍然很高,因而在数据层的功能是您优化代码时应当起首思索的。
  在投进到修复您的使用程序的功能成绩之前,确保您要先剖析您的使用程序来发明成绩的本源地点。关头功能计数器(比方谁人唆使在实行渣滓搜集过程当中消费的工夫百分比的计数器)在找出使用程序在那里消费了次要的工夫时也长短常有效的。固然那些消费工夫的中央常常是不那末直不雅的。
  在这篇文章中我会商了两种改善功能的办法:年夜块的优化,比方利用ASP.NET缓存,另有小块的优化,它们常常反复呈现。这些小块的优化偶然是最成心思的。您对代码的一个小的修正会被挪用不计其数次。对年夜块的优化,您大概会发明全部的功能有了一个年夜的奔腾。对小块的优化,您大概会缩减了对一个给定哀求的几微秒的工夫,可是假如把天天的一切的哀求积累起来,功能就会失掉一个意想不到的改善。
数据层中的功能
  当您要入手下手优化一个使用程序的功能的时分,有一个决意性的测试您能够优先思索利用:代码是不是要会见数据库?假如是,多长工夫会见一次?注重这个测试也能够使用到那些利用Web服务大概远程把持的代码中,可是我不会在这篇文章中触及那些内容。
  假如在您的代码中的某个代码路径中请求一个数据库哀求,而您发明其他中央您想要优先优化,比方字符串操纵,那末停上去然后先实行关头性的测试。除非您有一本性能其实糟的成绩要处置,不然您的工夫会失掉更好的使用,假如您把工夫花在优化数据库毗连的工夫,前往的数据量,另有您作的往复数据库的操纵中。
  如今我已整体先容了相干的信息,上面让我们看看10条帮您的使用程序体现更好的技能。我会从那些对改良功能效果最分明的中央入手下手说。
  技能1――前往多个了局集
  检察一下您的数据库代码,看看您是不是有会见数据库多于一次的哀求路径(requestpaths)。每一个如许的往复都回下降您的使用程序每秒能够服务的哀求的数目。经由过程在一次数据库哀求中前往多个了局集,您能够削减数据库通讯损耗的总工夫。在您削减了数据库服务器办理的哀求以后,您也会使您的体系更具可晋级性。
  一样平常您可使用静态SQL语句来前往多个了局集,我更喜好用存储历程。是不是应当把营业逻辑放在存储过程当中是存在争议的,但我以为假如一个存储过程当中的逻辑能够限定前往的数据(削减数据集的巨细,花在收集毗连上的工夫,而且不必要过滤逻辑层的数据),那它就是好器材。
  利用一个SqlCommand实例和它的ExecuteReader办法来天生强范例的营业类,您能够经由过程挪用NextResult让了局集指针向前挪动。展现了一个利用界说的类天生几个ArrayList的示例会话。只从数据库前往您必要的数据会明显地削减您服务器上的内存请求。
1//readthefirstresultset2reader=command.ExecuteReader();34//readthedatafromthatresultset5while(reader.Read()){6suppliers.Add(PopulateSupplierFromIDataReader(reader));7}89//readthenextresultset
10reader.NextResult();
11
12//readthedatafromthatsecondresultset
13while(reader.Read()){
14products.Add(PopulateProductFromIDataReader(reader));
15}
16
17
  技能2――分页数据会见
  ASP.NET的DataGrid供应了一个十分棒的才能:对数据分页的撑持。当在DataGrid中设置了分页,那末将一次显现一个特定命目标了局。别的,用来在了局之间导航的分页UI也会在DataGrid的底部显现出来。分页UI同意您在显现的数据之间向前导航大概向后导航,每页显现特定命目标了局。
  可是有一个小成绩。利用DataGrid分页时必要一切的数据都绑定到表格。比方,您的数据层会必要前往一切数据,然后DataGrid要依据以后页添补一切要显现的纪录。假如当您在利用DataGrid分页时前往了100,000笔记录,每次哀求城市抛弃99,975笔记录(假定每页的容量是25笔记录)。当纪录的数目不休增加时,使用程序的功能会遭到很年夜的影响,由于每次哀求都必需前往愈来愈多的数据。
  一个写出更好的分页代码的举措是利用存储历程。显现了一个示例存储历程,它为Nothwind数据库中的Orders数据表分页。总的来讲,在这里一切您必要做的就是传进页的索引和页的容量。数据库管帐算出得当的了局集然后前往它们。
1CREATEPROCEDUREnorthwind_OrdersPaged
2(
3@PageIndexint,
4@PageSizeint
5)
6AS7BEGIN
8DECLARE@PageLowerBoundint
9DECLARE@PageUpperBoundint
10DECLARE@RowsToReturnint
11
12--Firstsettherowcount
13SET@RowsToReturn=@PageSize*(@PageIndex+1)
14SETROWCOUNT@RowsToReturn
15
16--Setthepagebounds
17SET@PageLowerBound=@PageSize*@PageIndex
18SET@PageUpperBound=@PageLowerBound+@PageSize+1
19
20--Createatemptabletostoretheselectresults
21CREATETABLE#PageIndex
22(
23IndexIdintIDENTITY(1,1)NOTNULL,
24OrderIDint
25)
26
27--Insertintothetemptable
28INSERTINTO#PageIndex(OrderID)
29SELECT
30OrderID
31FROM
32Orders
33ORDERBY
34OrderIDDESC
35
36--Returntotalcount
37SELECTCOUNT(OrderID)FROMOrders
38
39--Returnpagedresults
40SELECT
41O.*
42FROM
43OrdersO,
44#PageIndexPageIndex
45WHERE
46O.OrderID=PageIndex.OrderIDAND
47PageIndex.IndexID>@PageLowerBoundAND
48PageIndex.IndexID<@PageUpperBound
49ORDERBY
50PageIndex.IndexID
51
52END
53
54
  在社区服务期中,我们写了一个分页服务端控件来做这些数据分页。您会发明我在利用技能1中会商过的头脑,从一个存储历程前往两个了局集:记录总数和哀求的数据。
  前往的纪录总数能够依据实行的哀求而有所分歧。比方,一个WHERE分句能够用来束缚前往的数据。我们必需晓得要前往的纪录总数,以盘算要在分页UI中显现的总的页数。比方,假如有1,000,000条总的纪录数,而一个WHERE分句用来把这些纪录过滤为1,000笔记录,分页逻辑必要晓得总的纪录数来得当的提交分页UI。
  技能3――毗连池
  在您的Web使用程序和SQLServer之间创建TCP毗连会是一个高贵的操纵。Microsoft的开辟者们已使用毗连池有一段工夫了,这同意他们重用与数据库的毗连。与其为每一个哀求创建一个新的TCP毗连,还不如只要在毗连池中没有一个可用的毗连的时分才创建一个新的毗连。当毗连封闭后,它前往到毗连池中――它还坚持着与数据库的毗连,而不是完整烧毁谁人TCP毗连。
  
  固然您必要当心保守的毗连。老是封闭您的毗连在您利用完它们时。我反复一遍:不论谁说了关于Microsoft.NET框架的渣滓接纳机制的甚么话,当您利用完时,您务必老是对您的毗连显式挪用Close大概Dispose办法。不要信任通用言语运转时(CLR)会在一个预定的工夫为您清算和封闭您的毗连。CLR会终极烧毁类而且强制毗连封闭,但您不克不及包管甚么时分在工具上的渣滓接纳机制会真正实行。
  要想利用毗连池到达最好效果,您必要遵守几条划定规矩。第一,翻开一个毗连,完成事情,然后封闭毗连。假如您不能不(最好使用技能1)为每一个哀求翻开和封闭几回毗连也是能够的,这比一向开着毗连然后把它传送给几个分歧的办法要好很多。第二,利用统一个毗连字符串(假如您在利用集成身份认证,固然还必要有不异的线程标识)。假如您不利用统一个毗连字符串,比方基于登录的用户的分歧自界说毗连字符串,您就不克不及失掉毗连池供应的不异的最优值。并且假如您在仿照大批的用户时利用了集成身份考证,您的毗连池的效力也会下降良多。在实验跟踪任何与毗连池有关的功能成绩时,.NETCLR数据功能计数器会很有效的。
  不管什么时候您的使用程序毗连一个资本,比方一个数据库,大概在另外一个历程中运转,您都应当经由过程把注重力会合到毗连到资本所消费的工夫上,发送和承受数据消费的工夫,另有往复与数据库的次数来举行优化。优化您的使用程序中的任何范例的历程跳转(processhop)都是入手下手到达更好功能的第一步。
  使用层包括毗连到您的数据层的逻辑,而且把数据转换为成心义的类实例和逻辑历程。比方,在社区服务器中,这里是您天生一个论坛大概线程汇合,而且使用营业划定规矩比方允许的中央;更主要的是这里是实行缓冲逻辑的中央。
  技能4――ASP.NET缓冲API
  在您入手下手编写使用程序的第一行代码之前要思索的第一件事变是,架构使用层来最年夜化而且使用ASP.NET的缓存特征。
  假如您的组件运转在一个ASP.NET使用程序当中,您只必要在您的使用程序项目中复杂的援用System.Web.dll就能够了。当您必要会见缓存时,利用HttpRuntime.Cache属性(这个工具也能够经由过程Page.Cache和HttpContext.Cache来会见)。
  利用缓存数占有几条准绳。第一,假如数据能够屡次利用,那末缓存它就是一个好的选择。第二,假如数据是通用的而不是给特定的哀求大概用户利用的,那末缓存它就是一个十分好的选择。假如数据是用户大概哀求特定的,可是他的保存期是很长的,那末它也能够被缓存,可是大概不会常常利用到。第三,一个常常被无视的准绳是,偶然候您能够缓存的太多了。一般在一台x86盘算机上,为了削减产生内存不敷(out-of-memory)毛病的大概性,您会但愿运转一个利用不凌驾800MB公有字节的历程。因而,缓存应当遭到限定。换句话说,您大概必要从头利用一次盘算的了局,可是假如谁人盘算必要十个参数,您大概必要实验缓存10个分列,而这大概会给您带来贫苦。因为过分缓存引发的内存不敷毛病是ASP.NET中最多见的,出格是关于年夜数据集的情形。
  缓存有几个极佳的功效,您必要对它们有所懂得。起首,缓存会完成比来起码利用的算法,使得ASP.NET可以在内存运转效力较低的情形下强迫缓存扫除――从缓存主动删除未利用过的项目。第二,缓存撑持能够强迫生效的过时依附项。这些依附项包含工夫、键和文件。工夫常常会用到,可是关于ASP.NET2.0,引进了一个功效更强的新生效范例:数据库缓存生效。它指的是当数据库中的数据产生变更时主动删除缓存中的项。有关数据库缓存生效的具体信息,请参阅MSDNMagazine2004年7月的DinoEspositoCuttingEdge专栏。要懂得缓存的系统布局,请参阅。
  技能5―每哀求缓存
  在本文后面部分,我提到了对常常遍历代码路径的一些小改良能够取得较年夜的全体功能收益。关于这些小改良,个中有一个相对是我的最爱,我将其称之为“每哀求缓存”。
  缓存API的计划目标是为了将数据缓存较长的一段工夫,大概缓存至满意某些前提时,但每哀求缓存则意味着只将数据缓存为该哀求的延续工夫。关于每一个哀求,要常常会见某个特定的代码路径,可是数据却只需提取、使用、修正或更新一次。这听起来有些实际化,那末我们来举一个详细的示例。
  在社区服务器的论坛使用程序中,页面上利用的每一个服务器控件都必要本性化的数据来断定利用甚么表面、利用甚么款式表,和其他本性化数据。这些数据中有些能够临时缓存,可是有些数据却只针对每一个哀求提取一次,然后在实行该哀求时代对其重用屡次,如要用于控件的表面。
  为了到达每哀求缓存,请利用ASP.NETHttpContext。关于每一个哀求,城市创立一个HttpContext实例,在该哀求时代从HttpContext.Current属性的任何地位都可会见该实例。该HttpContext类具有一个特别的Items汇合属性;增加到此Items汇合的工具和数据只在该哀求延续时代内举行缓存。正如您可使用缓存来存储常常会见的数据一样,您也能够利用HttpContext.Items来存储只基于每一个哀求利用的数据。它面前的逻辑十分复杂:数据在它不存在的时分增加到HttpContext.Items汇合,在厥后的查找中,只是前往HttpContext.Items中的数据。
  技能6―背景处置
  通往代码的路径应当尽量疾速,是吗?大概偶然您会发明您正在实行的针对每一个哀求实行的大概每n个哀求实行一次的义务所需资本十分多。发送电子邮件大概剖析和考证传进数据就是如许的一些例子。
  分析ASP.NETForums1.0偏重新构建构成社区服务器的内容时,我们发明公布新帖子的代码路径十分慢。每次公布新帖子的时分,使用程序起首必要确保没有反复的帖子,然后必需利用“坏词”选择器剖析该帖子,剖析帖子的字符图释,对帖子增加标志并举行索引,哀求时将帖子增加到符合的行列,考证附件,终极在帖子公布以后,当即向一切定阅者收回电子邮件关照。很分明,这触及良多操纵。
  经研讨发明,年夜多半工夫都花在了索引逻辑和发送电子邮件上。对帖子举行索引是一个十分耗时的操纵,人们发明内置的System.Web.Mail功效要毗连SMTP服务器,然后一连发送电子邮件。当某个特定帖子或主题范畴的定阅者数目增添时,实行AddPost功效所需的工夫也愈来愈长。
  其实不必要针对每一个哀求都举行电子邮件索引。幻想情形下,我们想要将此操纵举行批处置,一次索引25个帖子大概每五分钟发送一次一切电子邮件。我们决意利用我已经用于对数据缓存生效举行原型计划的代码,这个生效是终极被包括进了VisualStudio2005当中。
  System.Threading定名空间中的Timer类十分有效,可是在.NETFramework中不是很着名,最少关于Web开辟职员来讲是如许。创立以后,这个Timer类将以一个可设置的距离针对ThreadPool中的某个线程挪用指定的回调。这就暗示,您能够对代码举行设置,使其可以在没有对ASP.NET使用程序举行传进哀求的情形下得以实行,这是背景处置的幻想情形。您还能够在今后台历程中实行如索引或发送电子邮件之类的操纵。
  可是,这一手艺有几个成绩。假如使用程序域卸载,该计时器实例将中断引发事务。别的,由于CLR关于每一个历程的线程数目具有一个硬性尺度,以是在负载很重的服务器大概会呈现如许的情况:个中的计时器大概不克不及包管线程持续完成操纵,而且在某种水平上大概会形成提早。ASP.NET经由过程在历程中保存必定数目的可用线程,而且仅利用总线程的一部分用于哀求处置,试图将上述情形产生的时机降到最低。可是,假如您具有良多异步操纵时,这大概就是一个成绩了。
  这里没有充足的空间来安排该代码,可是您能够下载一个简单了解的示例,网址是www.rob-howard.net。请懂得一下BlackbeltTechEd2004演示中的幻灯片和演示。
  技能7―页输入缓存和代办署理服务器
  ASP.NET是您的暗示层(大概说应当是您的暗示层);它由页、用户控件、服务器控件(HttpHandlers和HttpModules)和它们天生的内容构成。假如您具有一个ASP.NET页,它会天生输入(HTML、XML、图象或任何其他数据),而且您针对每一个哀求运转此代码时,它城市天生不异的输入,那末您就具有一个可用于页输入缓存的尽佳备选内容。
  经由过程将上面这行内容增加页的最上端:
<%@PageOutputCacheVaryByParams="none"Duration="60"%>
  您就能够高效地为此页天生一次输入,然后对它举行屡次重用,工夫最长为60秒,此时该页将从头实行,输入也将再一次增加到ASP.NET缓存。经由过程利用一些初级别可编程API也能够完成此举动。关于输入缓存有几个可设置的设置,如方才讲到的VaryByParams属性。VaryByParams恰好被哀求到,但还同意您指定HTTPGET或HTTPPOST参数来变动缓存项。比方,只需设置VaryByParam="Report"便可对default.aspx?Report=1或default.aspx?Report=2举行输入缓存。经由过程指定一个以分号分开的列表,还能够指定其他参数。
  良多人还没无意识到当利用了输入缓存以后,ASP.NET页也会天生一些向下游到缓存服务器的HTTP题目头,如MicrosoftInternetSecurity和AccelerationServer或Akamai利用的题目头。设置了HTTP缓存表题头以后,能够在这些收集资本上对文档举行缓存,客户端哀求也可在不用前往原始服务器的情形下得以满意。
  因而,利用页输入缓存不会使得您的使用程序效力更高,可是它大概会削减服务器上的负载,由于下行流缓存手艺会缓存文档。固然,这只能是匿名内容;一旦它成为下行流以后,您就不再会看到这些哀求,而且再也没法实行身份考证以制止对它的会见了。
  技能8―运转IIS6.0(哪怕只为了利用内核缓存也好)
  假如您未运转IIS6.0(WindowsServer2003),那末您就错过了MicrosoftWeb服务器中的一些很好的功能加强。在技能7中,我会商了输入缓存。在IIS5.0中,哀求是经由过程IIS然落后进ASP.NET的。触及到缓存时,ASP.NET中的HttpModule会吸收该哀求,并前往缓存中的内容。
  假如您正在利用IIS6.0,就会发明一个很好的小功效,称为内核缓存,它不必要对ASP.NET举行任何代码变动。当哀求由ASP.NET举行输入缓存时,IIS内核缓存会吸收缓存数据的一个正本。当哀求来自收集驱动程序时,内核级其余驱动程序(无尚下文切换到用户形式)就会吸收该哀求,假如经由了缓存,则会将缓存的数据革新到呼应,然后完成实行。这就暗示,当您将内核形式缓存与IIS和ASP.NET输入缓存一同利用时,就会看到使人不敢信任的功能了局。在ASP.NET的VisualStudio2005开辟过程当中,我一度是卖力ASP.NET功能的开辟司理。开辟职员完成详细事情,可是我要看到天天举行的一切呈报。内核形式缓存了局老是最成心思的。最多见的特性是收集充斥了哀求/呼应,而IIS运转时的CPU利用率只要约莫5%。这太使人震动了!固然利用IIS6.0另有一些其他缘故原由,可是内核形式缓存是个中最分明的一个。
  技能9―利用Gzip紧缩
  固然利用gzip其实不必定是服务器功能技能(由于您大概会看到CPU利用率的进步),可是利用gzip紧缩能够削减服务器发送的字节数目。这就令人们以为页速率加速了,而且还削减了带宽的用量。依据所发送数据、能够紧缩的水平和客户端扫瞄器是不是撑持(IIS只会向撑持gzip紧缩的客户端发送经由gzip紧缩的内容,如InternetExplorer6.0和Firefox),您的服务器每秒能够服务于更多的哀求。实践上,几近每当您削减所前往数据的数目时,城市增添每秒哀求数。
  Gzip紧缩已内置到IIS6.0中,而且其功能比IIS5.0中利用的gzip紧缩要好的多,这是好动静。但不幸的是,当实验在IIS6.0中翻开gzip紧缩时,您大概没法在IIS的属性对话中找到该设置。IIS小组在该服务器中置进了出色的gzip功效,可是忘了包含一个用于启用该功效的办理UI。要启用gzip紧缩,您必需深切到IIS6.0的XML设置设置外部(如许不会引发心脏健壮)。特地提一句,这回功于OrcsWeb的ScottForsyth,他匡助我提出了在OrcsWeb上宿主的www.asp.net服务器的这个成绩。
  本文就不报告步骤了,请浏览BradWilson的文章,网址是IIS6Compression。另有一篇有关为ASPX启用紧缩的常识库文章,网址是EnableASPXCompressioninIIS。可是您应当注重,因为一些实行细节,IIS6.0中不克不及同时存在静态紧缩和内核缓存。
  技能10―服务器控件视图形态
  视图形态是一个风趣的称号,用于暗示在所天生页的埋没输入字段中存储一些形态数据的ASP.NET。当该页发还服务器时,服务器能够剖析、考证、并将此视图形态数据使用回该页的控件树。视图形态是一个十分壮大的功效,由于它同意形态与客户端一同坚持,而且它不必要cookie或服务器内存便可保留此形态。良多ASP.NET服务器控件都利用视图形态来坚持在与页元素举行交互时代创立的设置,比方保留对数据举行分页时显现确当前页。
  但是利用视图形态也有一些弱点。起首,当页被服务或被哀求时,它城市增添页的总负载。对发还服务器的视图形态数据举行序列化或作废序列化时,也会产生分外的开支。最初,视图形态会增添服务器上的内存分派。
  几个服务器控件有过分利用视图形态的趋向,即便在其实不必要的情形下也要利用它,个中最出名的是DataGrid。ViewState属性的默许举动是启用,可是假如您不必要,则能够在控件或页级别封闭。在控件内,只需将EnableViewState属性设置为false,大概在页中利用以下设置便可对其举行全局设置:

<%@PageEnableViewState="false"%>
  假如您不发还页,大概老是针对每一个哀求从头天生页上的控件,则应当在页级别禁用视图形态。
  小结
  我为您报告了一些我以为在编写高功能ASP.NET使用程序时有所匡助的技能。正如我在本文后面部分提到的那样,这是一个开端指南,并非ASP.NET功能的最初定论。(有关改良ASP.NET使用程序功能的信息,请参阅ImprovingASP.NETPerformance。)只要经由过程本人的亲自体验才干找出办理详细功能成绩的最好办法。可是,在您的路程中,这些技能应当会为您供应一些好的指南。在软件开辟中,几近没有相对的器材;每一个使用程序都是独一的。
  请参阅提纲栏“CommonPerformanceMyths”。
  RobHoward是TelligentSystems的开创人,专门处置高功能Web使用程序、常识库办理和合作体系方面的事情。Rob之前受雇于Microsoft,他在那边匡助计划了ASP.NET1.0、1.1和2.0的基本布局。要接洽Rob,请会见rhoward@telligentsystems.com。
我以前很喜欢Serv-U,自从它用Java重写之后我就再也没用过,实在是太慢了,我宁可用IIS搭建FTP,虽然IIS搭建FTP在权限管理上很不灵活。

仓酷云 发表于 2015-1-19 19:31:19

业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。

小女巫 发表于 2015-1-25 15:37:03

asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源

第二个灵魂 发表于 2015-2-2 22:39:03

ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。

活着的死人 发表于 2015-2-8 18:59:40

弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。

山那边是海 发表于 2015-2-25 22:49:15

最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。

再见西城 发表于 2015-3-8 09:45:14

由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。

海妖 发表于 2015-3-15 21:35:19

ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。

简单生活 发表于 2015-3-22 05:09:17

众所周知,Windows以易用而出名,也因此占据不少的服务器市场。

逍遥一派 发表于 2015-3-22 05:09:16

但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。
页: [1]
查看完整版本: ASP.NET编程:编写高功能Web使用程序的10个技能