发信人: deefish()
整理人: mrcloud(2000-08-24 02:27:49), 站内信件
|
让我来回忆一下新学:1 阅读了msdn上有关isapi的内容.
2 实现了一个简单的isa.
isapi是cgi的扩展.不同与cgi的独立执行(即每个客户请求服务器都为某开
一个进程),isapi采用多线程的方法,在同一进程内多线程出处理多用户(有
可能同步)的请求,所以只要dll装如运行长驻后,就能建设频繁为客户开
进程,分配资源的开销(开线程要比进程耗资少得多),从而提高服务器的
运行效率.isapi还提高了其他cgi替代如asp所不能提高的特性和性能,
比如通过return(HSE_STATUS_SUCCESS_AND_KEEP_CONN)保持serve与
elient的永久性连接.用mfc创建isapi extention dll vc先让你选择
是isa还是filter亦或以上两者同建于dll中,isa为你实现了
GetExtentionversion()、TerminateExtention()、CHttpExtentionProc()
中的前者并通过ON_PARSE_COMMAND宏将一个默认函数
Default()映射为默认处理(当请求参数为空ITS_EMPTY时调用此函数),
MFC将大部分实现都封装在一个CHttpServer,CHttpServerContext,
CHttpStream中,CHttpServer为每一个客户创建一个实例(类似于asp中
的—session)每个CHttpServerContext实例对应于一个session保存请
求的上下文即请求环境,包括server及client的请求信息。
ClassWizard在def文件里导出了三个函数HttpExtensionProc()、
GetExtensionVersion()、TerminateExtension(),你可以在加入
HttpExtensionProc()的实现,我们必须用个函数来处理客户的请求,
大部分的工作也是在这个函数用完成的(客户的每一次请求都调用此函数)。
MFC把复杂的参数用一个ECB*(LPEXTENTION_CONTROL_BLOCK扩展控制块)
来遮屏(呵呵,mfc的伎俩),ECB在这里显得比较重要了,特别是那四个回调
函数指针。ECB的原型如下:
typedef struct _EXTENSION_CONTROL_BLOCK
{ DWORD cbSize; //IN DWORD
dwVersion //IN HCONN ConnID; //IN
DWORD dwHttpStatusCode; //OUT
CHAR lpszLogData[HSE_LOG_BUFFER_LEN]; //OUT
LPSTR lpszMethod; //IN
LPSTR lpszQueryString; //IN
LPSTR lpszPathInfo; //IN
LPSTR lpszPathTranslated; //IN
DWORD cbTotalBytes; //IN
DWORD cbAvailable; //IN
LPBYTE lpbData; //IN
LPSTR lpszContentType; //IN
BOOL ( WINAPI * GetServerVariable )
( HCONN hConn, LPSTR lpszVariableName,
LPVOID lpvBuffer, LPDWORD lpdwSize );
BOOL ( WINAPI * WriteClient )
( HCONN ConnID, LPVOID Buffer,
LPDWORD lpdwBytes, DWORD dwReserved );
BOOL ( WINAPI * ReadClient )
( HCONN ConnID, LPVOID lpvBuffer, LPDWORD lpdwSize );
BOOL ( WINAPI * ServerSupportFunction )
( HCONN hConn, DWORD dwHSERRequest, LPVOID lpvBuffer,
LPDWORD lpdwSize, LPDWORD lpdwDataType );
} EXTENSION_CONTROL_BLOCK, *LPEXTENSION_CONTROL_BLOCK;
我吓了一跳,好长好长包括一长串的成员和主要的三个函数指针,我们就是用这
些东西干活的乐,ecb的详解还是请看msdn吧.ms提供的两个sample,一个是
counter,涉及请求处理,还有xbm图像显示,另一个是wwwquote,连接MS SQL
SERVER,要在NT下运行(因为涉及所谓真正的Multiple thread和
thread_safe的东东),至于是不是能运行于desktop版我就不得而知了。
最学习的捷径是作个实例,可惜isa调试起来非常麻烦。
(未完待续)
====================================================
※※来源※※编程回忆录 http://www.coolbel.com/ithink
====================================================
-- 我如果是一只菜鸟,也要用沙哑的声音歌唱!编程这活......
※ 修改:.deefish 于 Jun 17 13:54:37 修改本文.[FROM: 61.139.86.90] ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.139.86.90]
|
|