Use Response.IsClientConnected Before Embarking on Long Trips
If the user gets impatient, he or she may abandon your ASP page before you even start executing their request. If he clicks Refresh or moves to a different page on your server, you will have a new request sitting at the end of the ASP request queue and a disconnected request sitting in the middle of the queue. Often this happens when your server is under high load (so it has a long request queue, with correspondingly high response times) and this only makes the situation worse. There's no point executing an ASP page (especially a slow, heavyweight ASP page) if the user is no longer connected. You can check for this condition by using the Response.IsClientConnected
property. If it returns False
, you should call Response.End
and abandon the rest of the page. In fact, IIS 5.0 codifies this practice—whenever ASP is about to execute a new request, it checks to see how long the request has been in the queue. If it has been there for more than 3 seconds, ASP will check to see if the client is still connected and immediately terminate the request if it's not. You can use the AspQueueConnectionTestTime
setting in the metabase to adjust this timeout of 3 seconds.
If you have a page that takes a very long time to execute, you may also want to check Response.IsClientConnected
at intervals. When response buffering is enabled, it is a good idea to do Response.Flush
at intervals to give the user the impression that something is happening.
NoteOn IIS 4.0,
Response.IsClientConnected
will not work correctly unless you first do aResponse.Write
. If buffering is enabled, you'll also need to do aResponse.Flush
. On IIS 5.0, there is no need for this—Response.IsClientConnected
works fine. In any case,Response.IsClientConnected
has some costs, so only use it before an operation that takes at least, say 500 milliseconds (that's a long time if you're trying to sustain a throughput of dozens of pages per second). As a general rule of thumb, don't call it in every iteration of a tight loop, such as when painting the rows of a table—perhaps every 20th or 50th row of the table, instead.
Instantiate Objects Using the <object> Tag
If you need to refer to objects that might not be used in all code paths (especially Server- or Application-scoped objects), declare them by using the <object runat="server" id="objname">
tag in Global.asa rather than using the Server.CreateObject
method. Server.CreateObject
creates the object immediately. If you don't use that object later, you end up wasting resources. The <object id="objname">
tag declares objname, but objname isn't actually created until the first time that one of its methods or properties are used.
This is another example of lazy evaluation.
Use TypeLib Declarations for ADO and Other Components
When using ADO, developers often include adovbs.txt
to get access to ADO's various constants. This file must be included on every page that wants to use the constants. This constant file is fairly large, adding a lot of overhead to every ASP page's compilation time and script size.
IIS 5.0 introduces the ability to bind to a component's type library. This allows you to reference the type library once and use it on every ASP page. Each page does not pay the penalty of compiling the constant file, and component developers do not have to build VBScript #include files for use in ASP.
To access the ADO TypeLib, place one of the following statements in Global.asa.
<!-- METADATA NAME="Microsoft ActiveX Data Objects 2.5 Library"
TYPE="TypeLib" UUID="{00000205-0000-0010-8000-00AA006D2EA4}" -->
or
<!-- METADATA TYPE="TypeLib"
FILE="C:\Program Files\Common Files\system\ado\msado15.dll" -->
No comments:
Post a Comment