仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 635|回复: 10
打印 上一主题 下一主题

[学习教程] ASP编程:Matt Powell的《Server-Side 异步Web M...

[复制链接]
老尸 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 23:41:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
国内有些大的CRM厂商的ASP就写得不错.无论是概念还是它里面用JAVASCRIPT的能力.并不是说现在的程序员用了ASP.NET来写程序就可以说自己高档了server|web|异步|异步择要:MattPowell先容了怎样在服务器端利用异步Web办法,来创立高功能的MicrosoftASP.NETWeb服务。

  简介

  在玄月份的第三篇专栏(英文)中,我谈到了使用Microsoft?.NETFramework的客户端功效经由过程HTTP异步伐用Web服务的成绩。这类挪用Web服务的办法十分有效,利用时不用锁定您的使用程序或发生过量背景线程。如今我们懂得一下在服务器端供应相似功效的异步Web办法。异步Web办法在编写ISAPI扩大方面具有与HSE_STATUS_PENDING办法相似的高功能,但不必要为办理本人的线程池编写代码,同时又具有以托管代码体例运转的一切长处。  起首我们思索一下惯例的同步Microsoft?ASP.NETWeb办法。当您从同步Web办法前往时,将发送对该办法的呼应。假如必要较长的工夫来完成哀求,则处置哀求的线程会一向被占用,直到办法挪用停止。不幸的是,多半较长的挪用是由较长的数据库查询或对另外一个Web服务的挪用等事务引发的。比方,假如您挪用数据库,以后线程会一向守候挪用完成。线程无事可做,只是守候,直至听到查询的前往。当线程守候完成对TCP套接字或后端Web服务的挪用时,也会呈现相似的成绩。

  让线程处于守候形态很欠好,出格是在服务器的运转压力很年夜的情形下。守候中的线程不会举行任何无效事情,比方为其他哀求供应服务。我们必要找到一种办法,可以在服务器上入手下手较长的背景历程,同时又能将以后线程前往到ASP.NET历程池。然后,当较长的背景历程完成时,我们挪用一个回调函数,停止对哀求的处置,并经由过程某种体例关照ASP.NET哀求已完成。实践上,这类功效可由ASP.NET利用异步Web办法供应。

  异步Web办法的事情道理

  当您利用Web办法编写典范的ASP.NETWeb服务时,Microsoft?VisualStudio?.Net只是编译您的代码以创立程序集;当收到对其Web办法的哀求时,将挪用该程序集。程序集自己其实不晓得关于SOAP的任何事变。因而,当您的使用程序初次启动时,ASMX处置程序必需反应您的程序集,以断定供应哪些Web办法。关于惯例的同步哀求,这些操纵都很复杂:找出哪些办法具有联系关系的WebMethod属性、基于SOAPActionHTTP标头来设置挪用准确办法的逻辑。

  关于异步哀求,在反应过程当中,ASMX处置程序寻觅具有某种署名并将署名辨认为异步的Web办法。该处置程序将寻觅切合以下划定规矩的办法对:

  BeginXXX和EndXXXWeb办法,个中XXX是恣意字符串,暗示要供应的办法的称号。
  BeginXXX函数前往一个IAsyncResult接口,并分离承受AsyncCallback和一个工具,作为其最初两个输出参数。
  EndXXX函数承受一个IAsyncResult接口,作为其独一的参数。

  两个办法都必需利用WebMethod属性举行标识。

  假如ASMX处置程序发明两个办法切合上述一切前提,则将办法XXX作为惯例的Web办法在其WSDL中供应。该办法将承受在BeginXXX的署名中的AsyncCallback参数之前界说的参数作为输出,并前往由EndXXX函数前往的内容。因而,假如某个Web办法具有以下同步声明:



  [WebMethod]
  publicstringLengthyProcedure(intmilliseconds){...}





  则异步声明将为:




  [WebMethod]
  publicIAsyncResultBeginLengthyProcedure(
              intmilliseconds,
              AsyncCallbackcb,
              objects){...}

  [WebMethod]
  publicstringEndLengthyProcedure(IAsyncResultcall){...}





  每一个办法的WSDL都是不异的。

  在ASMX处置程序反应程序集并检测到某个异步Web办法后,它必需以分歧于处置同步哀求的体例处置对该办法的哀求。它将挪用BeginXXX办法,而不是某个复杂办法。它将传进的哀求复原序列化到要传送到函数的参数中(与处置同步哀求时一样);可是它还将指针传送到一个外部回调函数(作为BeginXXX办法的分外AsyncCallback参数)。

  这类办法相似于.NETFramework中Web服务客户端使用程序的异步编程形式。假如客户端撑持异步Web服务挪用,则能够为客户端盘算机开释占用的线程;假如服务器端撑持异步Web服务挪用,则能够开释服务器盘算机上占用的线程。但这里有两个关头的区分。起首,不是由服务器代码挪用BeginXXX和EndXXX函数,而是由ASMX处置程序挪用。其次,您要为BeginXXX和EndXXX函数编写代码,而不克不及利用由WSDL.EXE或VisualStudio.NET中的AddWebReference(增加Web援用)导游天生的代码。但了局是不异的,即开释线程以使其可以实行其他历程。

  ASMX处置程序挪用服务器的BeginXXX函数后,会将线程前往到历程线程池,使之可以处置吸收到的任何其他哀求。可是,还不克不及开释哀求的HttpContext。ASMX处置程序将守候,直到它传送给BeginXXX函数的回调函数被挪用,它才停止处置哀求。

  一旦回调函数被挪用,ASMX处置程序将挪用EndXXX函数,使您的Web办法能够完成任何所要实行的处置,而且能够失掉被序列化到SOAP呼应中的前往数据。EndXXX函数前往后将发送呼应,只要此时该哀求的HttpContext才失掉开释。







复杂的异步Web办法

  为举例申明异步Web办法,我从一个名为LengthyProcedure的复杂同步Web办法入手下手,其代码以下所示。然后我们再看一看怎样异步完成不异的义务。LengthyProcedure只占用给定的毫秒数。



[WebService]
publicclassSyncWebService:System.Web.Services.WebService
{
  [WebMethod]
  publicstringLengthyProcedure(intmilliseconds)
  {
    System.Threading.Thread.Sleep(milliseconds);
    return"乐成";
  }
}





  如今我们将LengthyProcedure转换为异步Web办法。我们必需创立如前所述的BeginLengthyProcedure函数和EndLengthyProcedure函数。请记着,我们的BeginLengthyProcedure挪用必要前往一个IAsyncResult接口。这里,我盘算利用一个托付和该托付上的BeginInvoke办法,让我们的BeginLengthyProcedure挪用举行异步办法挪用。传送到BeginLengthyProcedure的回调函数将被传送到托付上的BeginInvoke办法,从BeginInvoke前往的IAsyncResult将被BeginLengthyProcedure办法前往。

  当托付完成时,将挪用EndLengthyProcedure办法。我们将挪用托付上的EndInvoke办法,以传进IAsyncResult,并将其作为EndLengthyProcedure挪用的输出。前往的字符串将是从该Web办法前往的字符串。上面是其代码:




[WebService]
publicclassAsyncWebService:System.Web.Services.WebService
{
  publicdelegatestringLengthyProcedureAsyncStub(
    intmilliseconds);

  publicstringLengthyProcedure(intmilliseconds)
  {
    System.Threading.Thread.Sleep(milliseconds);
    return"乐成";
  }

  publicclassMyState
  {
    publicobjectpreviousState;
    publicLengthyProcedureAsyncStubasyncStub;
  }

  [System.Web.Services.WebMethod]
  publicIAsyncResultBeginLengthyProcedure(intmilliseconds,
    AsyncCallbackcb,objects)
  {
    LengthyProcedureAsyncStubstub
      =newLengthyProcedureAsyncStub(LengthyProcedure);
    MyStatems=newMyState();
    ms.prev</p>asp,你就只能等着微软给你解决,它不乐意你就只好悲催。而且asp跑在windows服务器上,windows服务器跟linux比起来简直弱爆了!
再现理想 该用户已被删除
沙发
发表于 2015-1-20 11:15:56 | 只看该作者
我就感觉到ASP和一些常用的数据库编程以及软件工程方面的思想是非常重要的。我现在也在尝试自己做网页,这其中就用到了ASP,我想它的作用是可想而知的。
飘灵儿 该用户已被删除
板凳
发表于 2015-1-25 23:05:54 | 只看该作者
跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组
精灵巫婆 该用户已被删除
地板
发表于 2015-1-27 22:36:31 | 只看该作者
我可以结合自己的经验大致给你说一说,希望对你有所帮助,少走些弯路。
兰色精灵 该用户已被删除
5#
发表于 2015-2-5 10:54:05 | 只看该作者
我想问如何掌握学习节奏(先学什么再学什么)最好详细点?
活着的死人 该用户已被删除
6#
发表于 2015-2-11 09:21:10 | 只看该作者
如何更好的使自己的东西看上去很不错等等。其实这些都不是问题的实质,我们可以在实践中不断提升自己,不断充实自己。
灵魂腐蚀 该用户已被删除
7#
发表于 2015-3-2 08:27:17 | 只看该作者
以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。
山那边是海 该用户已被删除
8#
发表于 2015-3-11 02:39:14 | 只看该作者
ASP主要是用好六个对象,其实最主要的是用好其中两个:response和request,就可以随心所欲地控制网页变换和响应用户动作了。
小魔女 该用户已被删除
9#
发表于 2015-3-17 19:09:46 | 只看该作者
ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp),它可以看作是VC和Java的混合体吧。
变相怪杰 该用户已被删除
10#
发表于 2015-3-17 19:09:46 | 只看该作者
我想问如何掌握学习节奏(先学什么再学什么)最好详细点?
乐观 该用户已被删除
11#
发表于 2015-3-24 21:09:08 | 只看该作者
不是很难但是英文要有一点基础网上的教程很少有系统的详细的去买书吧,另不用专门学习vb关于vbscript脚本在asp教材都有介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 20:50

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表