|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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比起来简直弱爆了! |
|