活着的死人 发表于 2015-1-16 22:47:01

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

那做企业软件是不是最好用J2EE?web|程序|技能|功能  利用ASP.NET编写Web使用程序的复杂水平使人不敢信任。正由于云云复杂,以是良多开辟职员就不会花工夫来计划其使用程序的布局,以取得更好的功能了。在本文中,我将报告10个用于编写高功能Web使用程序的技能。可是我其实不会将这些倡议仅范围于ASP.NET使用程序,由于这些使用程序只是Web使用程序的一部分。本文不作为对Web使用程序举行功能调剂的威望性指南―一整本书生怕都没法轻松讲分明这个成绩。请将本文视作一个很好的出发点。
  成为事情狂之前,我本来喜好攀岩。在举行任何年夜型攀岩举动之前,我城市起首细心检察指南中的线路,浏览之前旅客提出的倡议。可是,不管指南怎样好,您都必要真实的攀岩体验,然后才干实验一个出格具有应战性的攀爬。与之类似,当您面对修复功能成绩大概运转一个高吞吐量站点的成绩时,您只能进修怎样编写高功能Web使用程序。
  我的团体体验来安闲Microsoft的ASP.NET部门作为基本架构程序司理的履历,在此时代我运转和办理www.ASP.NET,匡助计划社区服务器的布局,社区服务器是几个出名
ASP.NET使用程序(组合到一个平台的ASP.NETForums、.Text和nGallery)。我确信有些已经匡助过我的技能对您一定也会有所匡助。
  您应当思索将使用程序分为几个逻辑层。您大概传闻过3层(大概n层)物理系统布局一词。这些一般都是划定好的系统布局体例,将功效在历程和/或硬件之举行了物理分别。当体系必要扩展时,能够很轻松地增加更多的硬件。可是会呈现一个与历程和呆板腾跃相干的功能下落,因而应当制止。以是,假如大概的话,请只管在统一个使用程序中一同运转ASP.NET页及其相干组件。

  由于代码分别和层之间的界限,以是利用Web服务或远程处置将会使得功能下落20%乃至更多。

  数据层有点不同凡响,由于一般情形下,最好具有公用于数据库的硬件。但是历程腾跃到数据库的本钱仍然很高,因而数据层的功能是您在优化代码时起首要思索的成绩。

  在深切使用程序的功能修复成绩之前,请起首确保对使用程序举行分析,以便找出详细的成绩地点。次要功能计数器(如暗示实行渣滓接纳所需工夫百分比的计数器)关于找出使用程序在哪些地位消费了其次要工夫也十分有效。但是消费工夫的地位一般十分不直不雅。

  本文报告了两品种型的功能改良:年夜型优化(如利用ASP.NET缓存),和举行本身反复的小型优化。这些小型优化偶然出格成心思。您对代码举行一点小小的变动,就会取得良多良多工夫。利用年夜型优化,您大概会看到全体功能的较年夜奔腾。而利用小型优化时,关于某个特定哀求大概只会节俭几毫秒的工夫,可是天天一切哀求加起来,则大概会发生伟大的改良。

  数据层功能

  谈到使用程序的功能调剂,有一个试纸性的测试可用来对事情举行优先级分别:代码是不是会见数据库?假如是,频次是如何的?请注重,这一不异测试也可使用于利用Web服务或远程处置的代码,可是本文对这些内容未做报告。

  假如某个特定的代码路径中必须举行数据库哀求,而且您以为要起首优化其他范畴(如字符串操纵),则请中断,然后实行这个试纸性测试。假如您的功能成绩不长短常严峻的话,最好花一些工夫来优化一下与数据库、前往的数据量、收支数据库的往复频次相干的消费工夫。

  懂得这些惯例信息以后,我们来看一下大概会有助于进步使用程序功能的十个技能。起首,我要报告大概会引发最年夜变动的变动。

  技能1―前往多个了局集

  细心检察您的数据库代码,看是不是存在屡次进进数据库的哀求路径。每一个如许的往复城市下降使用程序能够供应的每秒哀求数目。经由过程在一个数据库哀求中前往多个了局集,能够节俭与数据库举行通讯所需的总工夫长度。同时由于削减了数据库服务器办理哀求的事情,还会使得体系伸缩性更强。

  固然可使用静态SQL前往多个了局集,可是我首选利用存储历程。关于营业逻辑是不是应当驻留于存储历程的成绩还存在一些争议,可是我以为,假如存储过程当中的逻辑能够束缚前往数据的话(减少数据集的巨细、延长收集上所消费工夫,不用选择逻辑层的数据),则应同意如许做。

  利用SqlCommand实例及其ExecuteReader办法添补强范例的营业类时,能够经由过程挪用NextResult将了局集指针向前挪动。显现了利用范例类添补几个ArrayList的示例会话。只从数据库前往您必要的数据将进一步削减服务器上的内存分派。


Figure1ExtractingMultipleResultsetsfromaDataReader
//readthefirstresultset
reader=command.ExecuteReader();

//readthedatafromthatresultset
while(reader.Read()){
suppliers.Add(PopulateSupplierFromIDataReader(reader));
}

//readthenextresultset
reader.NextResult();

//readthedatafromthatsecondresultset
while(reader.Read()){
products.Add(PopulateProductFromIDataReader(reader));
}
  技能2―分页的数据会见

  ASP.NETDataGrid具有一个很好的功效:数据分页撑持。在DataGrid中启用分页时,一次会显现流动数目的纪录。别的,在DataGrid的底部还会显现分页UI,以便在纪录之间举行导航。该分页UI使您可以在所显现的数据之间向前和向后导航,而且一次显现流动数目的纪录。

  另有一个小小的妨害。利用DataGrid的分页必要一切数据均与网格举行绑定。比方,您的数据层必要前往一切数据,那末DataGrid就会基于以后页选择显现的一切纪录。假如经由过程DataGrid举行分页时前往了100,000个纪录,那末针对每一个哀求会保持99,975个纪录(假定每页巨细为25个纪录)。当纪录的数目不休增添时,使用程序的功能就会遭到影响,由于针对每一个哀求必需发送愈来愈多的数据。

  要编写功能更好的分页代码,一个极佳的体例是利用存储历程。显现了针对Northwind数据库中的Orders表举行分页的一个示例存储历程。简而言之,您此时要做的只是传送页索引和页巨细。然后就管帐算符合的了局集,并将其前往。

Figure2PagingThroughtheOrdersTable
CREATEPROCEDUREnorthwind_OrdersPaged
(
@PageIndexint,
@PageSizeint
)
AS
BEGIN
DECLARE@PageLowerBoundint
DECLARE@PageUpperBoundint
DECLARE@RowsToReturnint

--Firstsettherowcount
SET@RowsToReturn=@PageSize*(@PageIndex+1)
SETROWCOUNT@RowsToReturn

--Setthepagebounds
SET@PageLowerBound=@PageSize*@PageIndex
SET@PageUpperBound=@PageLowerBound+@PageSize+1

--Createatemptabletostoretheselectresults
CREATETABLE#PageIndex
(
IndexIdintIDENTITY(1,1)NOTNULL,
OrderIDint
)

--Insertintothetemptable
INSERTINTO#PageIndex(OrderID)
SELECT
OrderID
FROM
Orders
ORDERBY
OrderIDDESC

--Returntotalcount
SELECTCOUNT(OrderID)FROMOrders

--Returnpagedresults
SELECT
O.*
FROM
OrdersO,
#PageIndexPageIndex
WHERE
O.OrderID=PageIndex.OrderIDAND
PageIndex.IndexID>@PageLowerBoundAND
PageIndex.IndexID<@PageUpperBound
ORDERBY
PageIndex.IndexID

END
  在社区服务器中,我们编写了一个分页服务器控件,以完成一切的数据分页。您将会看到,我利用的就是技能1中会商的理念,从一个存储历程前往两个了局集:纪录的总数和哀求的数据。

  前往纪录的总数大概会依据所实行查询的分歧而有所变更。比方,WHERE子句可用来束缚前往的数据。为了盘算在分页UI中显现的总页数,必需懂得要前往纪录的总数。比方,假如统共有1,000,000笔记录,而且要利用一个WHERE子句将其选择为1000笔记录,那末分页逻辑就必要懂得纪录的总数才干准确出现分页UI。
  技能3―毗连池

  在Web使用程序和SQLServer之间设置TCP毗连多是一个十分损耗资本的操纵。Microsoft的开辟职员到今朝为止可以利用毗连池已有一段工夫了,这使得他们可以重用数据库毗连。他们不是针对每一个哀求都设置一个新的TCP毗连,而是只在毗连池中没有任何毗连时才设置新毗连。当毗连封闭时,它会前往毗连池,在个中它会坚持与数据库的毗连,而不是完整损坏该TCP毗连。

  固然,您必要当心是不是会呈现泄露毗连。当您完成利用毗连时,请必定要封闭这些毗连。再反复一遍:不管任何人对Microsoft?.NETFramework中的渣滓接纳有甚么批评,请必定要在完成利用毗连时针对该毗连显式挪用Close或Dispose。不要信任大众言语运转库(CLR)会在事后断定的工夫为您扫除和封闭毗连。只管CLR终极会损坏该类,并强迫毗连封闭,可是当针对工具的渣滓接纳真正产生时,其实不能包管。

  要以最优化的体例利用毗连池,必要恪守一些划定规矩。起首翻开毗连,实行操纵,然后封闭该毗连。假如您必需云云的话,能够针对每一个哀求屡次翻开和封闭毗连(最好使用技能1),可是不要一向将毗连坚持翻开形态并利用各类分歧的办法对其举行收支传送。第二,利用不异的毗连字符串(假如利用集成身份考证的话,还要利用不异的线程标识)。假如不利用不异的毗连字符串,比方依据登录的用户自界说毗连字符串,那末您将没法失掉毗连池供应的统一个优化值。假如您利用集成身份考证,同时还要摹拟大批用户,毗连池的效力也会年夜年夜下落。实验跟踪与毗连池相干的任何功能成绩时,.NETCLR数据功能计数器大概十分有效。

  每当使用程序毗连资本时,如在另外一个历程中运转的数据库,您都应当重点思索毗连该资本所花工夫、发送或检索数据所花工夫,和往复的数目,从而举行优化。优化使用程序中任何品种的历程腾跃都是取得更佳功能的主要一点。

  使用层包括了毗连数据层、将数据转换为成心义类实例和营业流程的逻辑。比方社区服务器,您要在个中添补Forums或Threads汇合,使用营业划定规矩(如权限);最主要的是要在个中实行缓存逻辑。

  技能4―ASP.NET缓存API

  编写使用程序代码行之前,一个主要完成的操纵是计划使用层的布局,以便最年夜化使用ASP.NET缓存功效。

  假如您的组件要在ASP.NET使用程序中运转,则只需在该使用程序项目中包含一个System.Web.dll援用。当您必要会见该缓存时,请利用HttpRuntime.Cache属性(经由过程Page.Cache和HttpContext.Cache也可会见这个工具)。

  关于缓存数据,有几个划定规矩。起首,假如数据大概会屡次利用时,则这是利用缓存的一个很好的备选情形。第二,假如数据是通用的,而不特定于某个详细的哀求或用户时,则也是利用缓存的一个很好的备选情形。假如数据是特定于用户或哀求的,可是寿命较长的话,仍旧能够对其举行缓存,可是这类情形大概其实不常常利用。第三,一个常常被疏忽的划定规矩是,偶然大概您缓存得太多。一般在一个x86盘算机上,为了削减内存不敷毛病呈现的时机,您会想利用不高于800MB的公用字节运转历程。因而缓存应当有个限制。换句话说,您大概可以重用某个盘算了局,可是假如该盘算接纳10个参数的话,您大概要实验缓存10个分列,如许有大概给您带来贫苦。一个请求ASP.NET的最多见撑持是因为过分缓存引发的内存不敷毛病,特别是关于年夜型数据集。

  缓存有几个极佳的功效,您必要对它们有所懂得。起首,缓存会完成比来起码利用的算法,使得ASP.NET可以在内存运转效力较低的情形下强迫缓存扫除-从缓存主动删除未利用过的项目。第二,缓存撑持能够强迫生效的过时依附项。这些依附项包含工夫、密钥和文件。工夫常常会用到,可是关于ASP.NET2.0,引进了一个功效更强的新生效范例:数据库缓存生效。它指的是当数据库中的数据产生变更时主动删除缓存中的项。有关数据库缓存生效的具体信息,请参阅MSDN?Magazine2004年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功效要毗连SMYP服务器,然后一连发送电子邮件。当某个特定张贴或主题范畴的定阅者数目增添时,实行AddPost功效所需的工夫也愈来愈长。

  其实不必要针对每一个哀求都举行电子邮件索引。幻想情形下,我们想要将此操纵举行批处置,一次索引25个张贴大概每五分钟发送一次一切电子邮件。我们决意利用之前用于对数据缓存生效举行原型计划的代码,这个生效是用于终极进进VisualStudio?2005的内容的。

  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标头,如MicrosoftInternetSecurityandAccelerationServer或Akamai利用的标头。设置了HTTP缓存标头以后,能够在这些收集资本上对文档举行缓存,客户端哀求也可在不用前往原始服务器的情形下得以满意。

  因而,利用页输入缓存不会使得您的使用程序效力更高,可是它大概会削减服务器上的负载,由于下流缓存手艺会缓存文档。固然,这大概只是匿名内容;一旦它成为下流以后,您就不再会看到这些哀求,而且再也没法实行身份考证以制止对它的会见了。

  技能8―运转IIS6.0(只需用于内核缓存)

  假如您未运转IIS6.0(WindowsServer?2003),那末您就错过了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。)只要经由过程本人的亲自体验才干找出办理详细功能成绩的最好办法。可是,在您的路程中,这些技能应当会为您供应一些好的指南。在软件开辟中,几近没有相对的器材;每一个使用程序都是独一的。
前天傍晚我发表了《Java的跨平台就是一句谎言。》,原本就是周末闲来无事,发表一篇略带争议性的博文让大家都来吵吵架,发表自己的看法,根本就没想着谁把谁打倒,一个行业或者是技术阵营是无法用短期口水仗打到对手的。

简单生活 发表于 2015-1-19 23:39:29

我的意思是.net好用,从功能上来说比JAVA强还是很明显的。

第二个灵魂 发表于 2015-1-25 14:46:01

提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。

灵魂腐蚀 发表于 2015-2-2 22:32:40

比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。

若相依 发表于 2015-2-8 16:24:05

是目前ASP在UNIX/Linux上的应用可以说几乎为0)。所以平台的局限性和ASP自身的安全性限制了ASP的广泛应用。

精灵巫婆 发表于 2015-2-25 20:45:03

提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。

飘飘悠悠 发表于 2015-3-8 03:06:27

但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。

乐观 发表于 2015-3-15 20:19:01

ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。
页: [1]
查看完整版本: ASP.NET编程:编写高功能Web使用程序的10个进门技能