发现 ISAPI。图形小程序的数据提供程序





4.00/5 (9投票s)
2002年5月17日
3分钟阅读

75649

2339
使用 ISAPI 扩展为图形小程序提供在线数据的示例。
引言
很久以前,我实现了一个从 SQL 数据库到一些图形小程序的数据提供系统。最初,我们认为一个普通的 ASP 脚本可以读取数据并将其提供给小程序。不幸的是,事实并非如此!当站点上的并发用户数超过 80-100 用户,并且用户尝试在小程序中获取大量数据时,Web 服务器会崩溃。因此,我们决定将数据提供迁移到 ISAPI DLL。
优点
- ASP 服务器将从客户端小程序调用中解放出来。这样,ASP 将只响应普通的站点请求;ASP 不会因小程序调用而产生任何超时。
- 将数据库连接保留在 ISAPI 缓存中,这样所有对数据库的请求都不会因为打开连接而浪费时间,而是使用公共的打开连接变量(
CAdoDatabase m_AdoDB
)。 - 如果您想获得 IIS Web 服务器的最大并发连接数或提供海量 HTML 数据,ISAPI 扩展 DLL 是最佳选择。
功能
ASP 脚本加载 applet
类并为其提供一些参数,例如颜色、HTTP 请求的时间间隔、Web 应用程序 URL 等。
<applet codebase="../AspDemoFeed/Tools/OnlineScroll/CLASSES/JavaScroller/"
archive="../AspDemoFeed/Tools/OnlineScroll/Scroller.jar"
code="ScrollerStartUp.class" width="600"
height="20" VIEWASTEXT id="Scroller">
param name="speed" value="3"
param name="bgcolor" value="696969"
param name="Font" value="Arial|1|16"
param name="changeFontSize" value="11"
param name="feedURL" value="
<%=Application("WebURL")%>cgi-bin/IsapiDemoFeed.dll?GetOnlineScrollerData?"
param name="updateInterval" value="20000"</applet>
Java 小程序将从客户端向 Web 服务器 HTTP 发出请求,使用 received web URL
参数。请求以 updateInterval
参数给出的毫秒间隔进行。如果您在客户端打开 Java 控制台,您会看到一些消息,例如
Loading data from
https:///projects/Articles/AspDemoFeed/cgi-bin/IsapiDemoFeed.dll?GetOnlineScrollerData?0&4
ISAPI 模块以小程序已知的格式——HTML 流——响应 HTTP 请求。
0|2232160|453.4|2|14:19:06
1|576920|139.1|1|14:19:06
2|4006410|796.8|4|14:19:06
3|2511860|-31.5|2|14:19:06
4|2478810|529.2|0|14:19:06
对于每个 HTTP 请求,ISAPI 模块会再次使用 CodeProject 网站上的 CAdoDatabase
和 CAdoRecordset
类向 SQL 数据库发出请求 :)。一个小修改是将数据库连接保持为 public
变量。在每个方法中,都会打开和关闭所需的记录集。一种优化是使用 AdoRecordset
类的 GetString
方法,该方法返回格式化的文本数据。由于 ISAPI DLL 更难调试,因此必须更加注意捕获错误,并使用 try
/catch
宏进行处理。
try
{
CAdoRecordset* AdoRS = new CAdoRecordset; //create a recordset variable
if ( DBConnectionOpen( m_bstrConnectionString ) ) //look at db connection to be online
{ //open the recordset
if ( AdoRS->Open(m_AdoDB.GetActiveConnection(), bstrSTMT, adOpenForwardOnly,
adLockReadOnly, adUseClient ) ) //here the disc params
{
if (!AdoRS->IsEof()) //look if we have records
varOutput = AdoRS->GetString("|", "\n", 0 );
else
varOutput = "0 0 0 0 0 ";
AdoRS->Close(); //close the recordset
if (AdoRS)
delete AdoRS;
}
else //set the custom error
{
wsprintf(wcOut,"Encountered Error:<br>%s<br>
%s<br>%s<br>%s<br>","MyFunction"
(LPCTSTR)m_AdoDB.GetLastError(), "RS isnt open", bstrSTMT );
*pCtxt << wcOut ;
return;
}
}
else //set the custom error
{
wsprintf(wcOut, "Encountered Error:<br>%s<br>
%s<br>%s<br>%s<br>","GetMarketMapData",
(LPCTSTR)m_AdoDB.GetLastError(), "DB isn't open", bstrSTMT );
*pCtxt << wcOut ;
return;
}
}
catch(_com_error err)
{
wsprintf(wcOut, "Encountered Error :<br>
%s<br>%d<br>%s<br>", (LPSTR)err.Description(),
err.Error(), (LPSTR)err.ErrorMessage() );
*pCtxt << wcOut ;
return;
}
*pCtxt << varOutput; //here is the output
重要提示:要测试数据提供,您必须更新 tblOnline
* 表中的值。更新将立即在线反映在 Online 表和滚动小程序中。要查看其如何与 Intraday charts 小程序一起工作,请向 tblIntraday*
表中插入数据。这些小程序会永久监视这些表,并更新单元格中的值和图表上的点。
Install
ASP 连接字符串
位于 Includes\_incConnectionOn.asp 文件中。cnx.Provider = "sqloledb" cnx.Open "Data Source=andi;Initial Catalog=ArticlesIsapiFeed;", "sa", ""
ISAPI 连接字符串
位于 IsapiDemoFeed.cpp 文件的构造函数中。m_bstrConnectionString="Provider=SQLOLEDB;Data Source=andi;Initial Catalog=ArticlesIsapiFeed; User ID=sa;Password=;";
- 将 "AspDemoFeed" 文件夹复制到您的网站下,并将其设为 ASP 应用程序,以使会话和
应用程序 ASP 对象正常工作。 - 为 "
AspDemoFeed
" Web 应用程序的 "cgi-bin" 目录授予 "Scripts and Executables" 执行权限。
这样,IIS Web 服务器将能够执行 IsapiDemoFeed.dll。 - 要在您的 SQL 服务器上安装数据库,请在 SQL Server Enterprise Manager 中选择 "restore database"(还原数据库)选项,然后选择 "DB/ArticlesIsapiFeed.bak" 文件备份。数据库名称为
ArticlesIsapiFeed
。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。