本文转载自微软嵌入式中文社区 www.msembed.com
摘要
当开发人员在Windows CE上实现一个webserver时,他们通常会想到要实现PC平台上的webserver有的大多数的功能。但是对于Windows CE IIS来说这不可行。Windows CE IIS对于有些功能特性不支持,例如过程标号(session ID).本文描述了如何通过互联网服务器应用程序编程接口(ISAPI)来实现这些功能特性。最后,文章用一个例子来说明如何来做这件事情。
结构图
Isapi扩展动态连接库
Windows CE IIS不支持Web服务器有时需要的两项功能,它们是
- 事务间的状态(States between Transactions)
- 过程标号的管理
ISAPI(Internet server application programming interface)扩展可以使我们支持这些特性。以下部分是怎样来实现。
ISAPI被开发出用来给应用程序开发人员一个有力的方法来扩展IIS的功能。为了生成Windows CE Web Server的ISAPI扩展,需要编译生成一个动态连接库,该动态连接库导出如下标准ISAPI入口:
GetExtensionVersion
HttpExtensionProc
TerminateExtension (可选)
GetExtensionVersion在动态连接库第一次被装载时被调用,HttpExtensionProc在每个接入请求来到时都被调用,TerminateExtension在动态连接库被卸载时被调用。和Web服务器的交互通过标准的ISAPI回调函数来进行,比如ReadClient和WriteClient等。
因为所有的请求都只被这个动态连接库处理,所以以下功能可以被实现:
- 过程标号(Session Id)的管理
- 提供登录认证
- 发送定制化文件
- 一些实时变量,例如CPU的温度、使用情况、风扇转速、连结的设备和IP设置等都可以轻松地通过调用对应的API而获得并嵌入页面中。
怎样装载ISAPI扩展动态连接库
除了编译过程中加入web server组件外,还需加入以下的注册表项来实现动态连接库的自动装载:
[HKEY_LOCAL_MACHINE\COMM\HTTPD\VROOTS\/]
@="\\windows\\sampleisapi.dll"
"a"=dword: 0 ;用于移除认证
Web服务器在收到来自任意客户端的一个请求后将装载此动态连接库。此动态连接库可以处理任意数量的客户端的请求。
被导出的函数
HttpExtensionProc在每个请求到来后都被调用。对此请求的处理在此函数中进行。
1.GetExtensionVersion
此函数在动态连接库第一次被装载时调用。
2.HttpExtensionProc
这是此动态连接库唯一重要的函数。此函数在每个请求到来后都被调用。GetServerVariable函数可以用来获得查询字符串值,根据收到的查询结果,用WriteClient 函数可以将相应的被请求文件写回到客户端。若需从客户端读取数据,可以使用ReadClient函数。
此函数的原型如下:
DWORDWINAPIHttpExtensionProc(LPEXTENSION_CONTROL_BLOCKlpECB);
|
这里的LPEXTENSION_CONTROL_BLOCK被声明如下.:
|
|
typedefstruct_EXTENSION_CONTROL_BLOCK {
|
|
DWORDcbSize; DWORDdwVersion; HCONNConnID; DWORDdwHttpStatusCode; CHARlpszLogData[HSE_LOG_BUFFER_LEN]; LPSTRlpszMethod; LPSTRlpszQueryString; LPSTRlpszPathInfo; LPSTRlpszPathTranslated; DWORDcbTotalBytes; DWORDcbAvailable; LPBYTElpbData; LPSTRlpszContentType; BOOL(WINAPI*GetServerVariable); BOOL(WINAPI*WriteClient); BOOL(WINAPI*ReadClient); BOOL(WINAPI*ServerSupportFunction);
|
|
}EXTENSION_CONTROL_BLOCK,LPEXTENSION_CONTROL_BLOCK;
|
<!--{13080229328130}-->
3.TerminateExtension
此函数在动态连接库被卸载时调用。
GetServerVariable
GetServerVariable函数被用来获取服务器变量,例如IP地址,查询字符串等。
1.原型
BOOL WINAPI GetServerVariable(HCONN hConn, LPSTR lpszVariableName, VOID lpvBuffer, LPDWORD lpdwSizeofBuffer );
2.参数
hConn
指定连结句柄。这是HttpExtensionProc函数的输入参数。
lpszVariableName
一个NULL结尾的字符串用以标明被请求的服务器变量。
lpvBuffer
指向接受被请求信息的缓冲区。
lpdwSizeofBuffer
指向一个DWORD变量,该变量表明了lpvBuffer指向的缓冲区的大小。在成功调用后,此DWORD值为传到缓冲区的字节数目,包括Null结尾字节。
一些可以用GetServerVariable函数来获取的重要变量如下:
PATH_INFO 由客户端给出的URL的尾部路径信息。
QUERY_STRING 指定了URL中的第一个问号后的信息。
REMOTE_ADDR 指定了客户端的IP地址。
实现示例
正如已经提到的,ISAPI扩展动态连接库的主要用途是管理过程标号(session id)和获得一些实时参数如IP地址设置等。
1.用字符串参数调用外部动态连接库并将返回结果插入到发送给客户端的HTML输出中
我们刚才已经提到,要发送给客户端的html和java脚本文件是在存储设备上已有的。现在在存储这些文件之前,一些特殊符号可以被包含在html文件中来提示ISAPI动态连接库这些符号应被替换为一些实时变量。例如以下格式可以被包含在html文件里
!!DllName!!FunctionName!!
例如如果你想显示设备的IP地址,你可以加入如下的符号序列来告诉ISAPI将此符号序列替换为IP地址。
!!NetStatusDll!!GetIPAddress!!
在将文件发送到客户端之前,ISAPI动态连接库会解析文件中的符号序列。当找到以上序列后,将替换序列中的DllName和FunctionName。装载动态连接库后将调用解析到的函数,并将序列替换为函数返回的字符串。在上面这个例子中,NetStatus.dll通过调用LoadLibrary API被装载,函数GetIPAddress的地址通过调用GetProcAddress API而获得,最后函数GetIPAddress被调用。
同样地,当使用者希望设置设备上的实时变量时,发出的消息数据也可以包含符号序列。例如如果使用者希望从远程客户端为设备设置IP地址时,带有DllName和FunctionName的符号序列可以被加入到点击网页上的某个按钮时发出的消息数据中。
2.管理过程标号
可以生成下表来管理过程标号:
IP地址
|
过程标号
|
最后的Tick数(ms)
|
176.234.11.23
|
12avcdefdef
|
10000
|
23.123.45.6
|
234rfvdadds
|
23456
|
145.67.89.90
|
123456asdfg
|
45678
|
<!--{13080229328131}-->
当从一个新的客户端(例如新的IP地址)收到请求后,一个随机过程标号被生成并分配给该IP地址,同时此标号被存入XML数据库中。不论什么时候从任何客户端收到请求后,该表中的数据将被检查,如果对应的客户端项已存在于表中,则网页内容将被发送至客户端。如果客户端项不存在,那么只有登录页面被发送至客户端。表中的最后Tick数可以用来判断过程是否超时。
总结
本文解释了Isapi扩展动态连接库的用法。Isapi扩展动态连接库多用于需要使用一些实时变量如CPU温度,IP地址设置等的网页文件中。
分享到:
相关推荐
虚拟机vmware workstatiions pro 17.6.1个人使用免费,不用证书直接安装使用
scipy-1.2.0-cp35-cp35m-linux_armv7l.whl
基于springboot爬虫高考志愿智能推荐系统源码数据库文档.zip
bimdata_api_client-4.3.0-py3-none-any.whl
Pillow-7.0.0-cp37-cp37m-linux_armv7l.whl
onnxruntime-1.16.2-cp38-cp38-win_amd64.whl
opencv_python-4.4.0.46-cp39-cp39-linux_armv7l.whl
论文描述:该论文研究了某一特定领域的问题,并提出了新的解决方案。论文首先对问题进行了详细的分析和理解,并对已有的研究成果进行了综述。然后,论文提出了一种全新的解决方案,包括算法、模型或方法。在整个研究过程中,论文使用了合适的实验设计和数据集,并进行了充分的实验验证。最后,论文对解决方案的性能进行了全面的评估和分析,并提出了进一步的研究方向。 源码内容描述:该源码实现了论文中提出的新的解决方案。源码中包含了算法、模型或方法的具体实现代码,以及相关的数据预处理、实验设计和性能评估代码。源码中还包括了合适的注释和文档,以方便其他研究者理解和使用。源码的实现应该具有可读性、可维护性和高效性,并能够复现论文中的实验结果。此外,源码还应该尽可能具有通用性,以便在其他类似问题上进行进一步的应用和扩展。
ta_lib-0.5.1-cp313-cp313-win32.whl
STM32开发相关软件ISP 程序下载STM32开发相关软件ISP 程序下载提取方式是百度网盘分享地址
java源码资源基于JAVA的UDP服务器模型源代码提取方式是百度网盘分享地址
基于Python+Django的电影票房数据分析系统源码数据库文档.zip
onnxruntime-1.19.0-cp311-cp311-win_amd64.whl
Java固定资产管理系统源码 固定资产管理系统是对高校固定资产的一个信息化管理系统,基本功能包括:对固定资产的购进、接触、销毁,对物品的使用状态、借出状态、库存状态等进行标识,对各类物品进行编号,根据编号进行查询,根据名称进行查询等。本系统结构如下: (1)系统登录:用户登录模块:登录功能 重置 (2)系统用户管理:对系统用户的增加 系统用户的权限修改 系统用户的删除 分配系统用户的权限 修改本身登录密码 资产的相关维护 (3)员工信息管理:教工的增加、修改、删除、查询 (4)资产入库管理:资产的属性修改 资产的报废删除 资产的属性查询 (5)资产维护管理:物资的维修、维护物资的信息修改 (6)资产借还管理:增加借出资产 查询借出资产 归还已借出资产(7)打印报表
matplotlib-3.7.0-cp311-cp311-linux_armv7l.whl
基于springboot的房屋租赁管理系统源码数据库文档.zip
opencv_contrib_python-4.1.0.25-cp35-cp35m-linux_armv7l.whl
bimdata_api_client-3.1.0-py3-none-any.whl
本23级物流01班谭敏20234970114.docx
opencv_contrib_python-4.5.2.52-cp39-cp39-linux_armv7l.whl