多语言展示
当前在线:156今日阅读:84今日分享:32

创建ISAPI扩展

本节介绍如何使用ISAPI扩展创建动态内容。ISAPI扩展以CGI方式提供相同功能,但是比CGI,ASP,调用COM+ 组件的文件执行速度更快。详细的信息请参阅 ISAPI扩展。IIS SDK平台部分包含完整示例代码和有用工具。这些代码示例可以通过网络从SDK平台更新中下载。本节包含大部分示例代码来自完整示例代码。本节内容这个部分包含以下主题: o ISAPI应用程序设计 o 实现所需ISAPI扩展函数 o 创建一个简单的ISAPI扩展 o 使用ISAPI扩展回调函数 o 调用 HSE_REQ_EXEC_URL 和 HSE_REQ_EXEC_UNICODE_URL o 从ISAPI扩展中发送响应报头 o ISAPI扩展中使用异步I/O处理 o 拦截IIS所有传入请求 o 使用通配符应用程序重新映射URL o 使用通配符应用程序映射实现自定义身份验证 o 在ISAPI应用中获取服务器变量 o 控制ISAPI扩展标识 o 在ISAPI扩展中使用 HSE_REQ_SEND_URL_REDIRECT_RESP 重定向 o 调试 ISAPI应用程序ISAPI扩展设计问题.本主题提供有关设计ISAPI扩展时应该思考的问题:进程隔离由于ISAPI DLL扩展以IIS方式加载到相同进程,ISAPI扩展可能存在访问冲突和其它bugs导致IIS崩溃。因此,所有ISAPI扩展都应该彻底测试以确保完整性。这样做有一种方法,将不可信DLL运行在单独进程以进程外标记应用程序方式放置扩展。这么做将导致IIS使用进程隔离技术,在IIS主进程外执行ISAPI DLL。IIS为这种外部过程执行故障检测和恢复。状态维护ISAPI扩展通常在GetExtensionVersion函数入口点进行初始化。此外,使用Visual C++开发DLL, entry/exit 函数(通常是DllMain)也会产生初始化。和任何Win32 DLL一样,当扩展通过IIS第一次DLL加载/卸载时 c 运行时库调用 entry/exit 函数,在进程中一个新线程(除了主线程)被建立或销毁。这样做的好处是,使用DLL自身维护统计与DLL有关系的任何信息。通过创建表单,它使DLL性能测量成为可能;信息可集成到系统性能计数器,方便使用 SysMon。此外,EXTENSION_CONTROL_BLOCK 结构的 lpszLogData 成员可用于服务器日志上记录数据。语言和框架选择IIS SDK示例使用C或C++开发,未使用微软基础类库(MFC)。MFC库提供一个对象模型及更友好向导方便创建ISAPI扩展。提供类集如 CHttpServer,CHttpServerContext,和CHtmlStream支持。更多MFC相关信息,请参阅 MFC库和Visual C++ SDK。线程安全设计和线程同步由于所有(进程内)请求,与DLL使用相同方式映射到IIS进程空间进行处理,所以必须使用线程安全程序和架构设计和实现ISAPI扩展。这尤其重要,若扩展依赖于全局状态信息或结构,如辅助线程工作队列。操作系统序列化调用DLL的 entry/exit 函数 DllMain。使用线程同步实现序列化,存在内部交互问题。最好DllMain内部避免使用或请求线程同步机制(包含一些 Win32 WaitFor...函数)。有关编写多线程安全 DLL 的更多信息,请参阅平台SDK 进程和线程,或Win32 高级编程书籍。报告不健康状态ISAPI扩展应用可以创建编程信号以方便回收。可以通过使用新的 ServerSupportFunction 调用 HSE_REQ_REPORT_UNHEALTHY 实现。请注意程序等级是指定ISAPI程序接口。ASP或ASP.NET代码不能实现这种逻辑类型。这个功能仅对运行在工作进程隔离模式的ISAPI扩展有效。若要 HSE_REQ_REPORT_UNHEALTHY 使用有效,IIS 服务器必须开启 pinging 操作,运行进程管道应用(即如果它不健康,运用 Ping 来请求回收)WAS(配置与进程管理) 检测ISAPI信号,确定不健康状态。ISAPI必须实现一些内部机制用于确定其不健康状态,如监视内部线程池状态。注释:这类型程序会导致正在运行ISAPI扩展的进程关闭。此外,所有工作进程中运行的应用将重启。ASP的ISAPI扩展实现这个功能的高级逻辑,监视内部线程池状态。若太多线程处于阻塞状态,将标记回收。下面是使用 HSE_REQ_REPORT_UNHEALTHY 代码示例演示:DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB){ // ... fResult = pECB->ServerSupportFunction( pECB->ConnID, HSE_REQ_REPORT_UNHEALTHY, szReason, NULL, NULL); // ...}VectorSend(HSE_REQ_VECTOR_SEND)函数IIS 6.0版本以前,若 ISAPI 开发人员拥有多个缓冲区来组成一个响应,他们只有两种可能作法。他们可调用 WriteClient 多次,或在一个大型缓冲区内组合出响应。' 第一种作法会造成效能瓶颈,因为每个缓冲区都有一个内核模式转变。' 第二种作法不仅会影响效能,还需要额外的内存。VectorSend 是 IIS 6.0 解决此问题的方式。VectorSend 实作成 ISAPI 的服务器支持功能,可让开发人员将一群缓冲区和文件句柄放在一起,以便依序传送,接着交由 IIS 6.0 编译出最后的响应。HTTP.sys 会将所有的缓冲区和/或文件句柄编译到核心内的一个响应缓冲区,接着传送它。如此,ISAPI 就不用创建缓冲区处理此工作或多次 WriteClient。
推荐信息