当前位置: 首页 > 编程日记 > 正文

ISAPI在IIS7上的配置

主要介绍ISAPI的作用、ISAPI在IIS7上的配置、开发ISAPI的基本内容及使用VS 2008配置ISAPI DLL开发项目。

一、ISAPI介绍

缩写词=Internet Server Application Programming Interface为Microsoft所提的Internet server的API 。

ISAPI分为两种:ISAPI extension (ISAPI扩展)和 ISAPI filter (ISAPI筛选器)。

1、ISAPI 服务器扩展是可以被 HTTP 服务器加载和调用的 DLL。ISAPI扩展(extension)也称为 Internet 服务器应用程序 (ISA),用于增强符合 Internet 服务器 API (ISAPI) 的服务器的功能。ISAPI扩展(extension)通过浏览器应用程序调用,并且将相似的功能提供给通用网关接口 (CGI) 应用程序。

2、ISAPI 筛选器是在启用 ISAPI 的 HTTP 服务器上运行的 DLL,用以筛选与服务器之间来回传送的数据。该筛选器注册事件的通知,例如登录或 URL 映射。当发生选定事件时,筛选器被调用,并且您可以监视及更改数据(在数据从服务器传输到客户端或相反的过程中)。可以使用 ISAPI 筛选器提供增强的 HTTP 请求记录(例如,跟踪登录到服务器的用户)、自定义加密、自定义压缩或其他身份验证方法。

二、ISAPI导出函数

1. ISAPI扩展(ISAPI extension)导出函数:

1、BOOL WINAPI GetExtensionVersion( HSE_VERSION_INFO *pVer);
该函数是扩展DLL文件第一次被加载到站点处理进程时被调用。

2、DWORD WINAPI HttpExtensionProc( LPEXTENSION_CONTROL_BLOCK lpECB);
该函数是IIS服务每次触发ISAPI扩展时所调用的函数。也就是IIS服务增强服务时具体的实现内容通过本函数的调用。

3、BOOL WINAPI TerminateExtension( DWORD dwFlags);
该函数是ISAPI扩展DLL文件从进程中被载时调用一次。

2. ISAPI 筛选器(ISAPI filter)导出函数

1、BOOL WINAPI GetFilterVersion( PHTTP_FILTER_VERSION pVer);
该函数是DLL筛选器第一次被加载到站点处理进程时被调用。

2、DWORD WINAPI HttpFilterProc(PHTTP_FILTER_CONTEXT pfc,DWORD notificationType,LPVOID pvNotification);
该函数用于响应注册在 GetFilterVersion 的形参PHTTP_FILTER_VERSION 中的dwFlags通知事件。根据所注册的通知事件进行相应的筛选处理。

3、BOOL WINAPI TerminateFilter(DWORD dwFlags);
该函数是DLL筛选器被站点处理进程卸载时时所调用的处理。

三、使用Visual Studio创建ISAPI项目

在Visual Studio 2008的版本及以后版本中,Visual C++的创建项目类别中,不再有关于ISAPI扩展和ISAPI筛选器的直接项目相关的创建选项。因此在VS2008中的Visual C++创建项目类别中,选择“Win32项目”的项目类别,然后根据“添加新项目”向导中的应用程序类别下的“DLL”并选择“空项目”复选框来创建一个空白的dll项目,并且由此配置成ISAPI扩展和ISAPI筛选器的dll项目。

1. 创建空白的DLL项目步骤

1)打开“Visual Studio2008”,选择VS界面主菜单上的“文件(F)”菜单项,选择“新建(N)”菜单项下的“项目(P)”菜单,打开“新建项目”对话框。

2)选择“新建项目”对话框中的项目类型中的“Visual C++”树节点下的“Win32”节点;

3)在右边的“模板”框中,选择”Win32项目”,然后填写相关的名称、位置、解决方案名称等信息后“确认”,打开“Win32应用程序向导”对话框;

4)点击打开的“Win32应用程序向导”对话框中的下一步,选择应用程序类别“DLL”,选择附加选项“空项目”,“确定”完成新项目创建。

2. 配置空白DLL项目生成ISAPI扩展(ISAPI Extension) DLL。

步骤1:右击项目,使用“添加”菜单下的“新建项…”菜单项,使用“添加新项”添加C++文件;

步骤 2:在新建的cpp文件中,#include 并实现三个导出函的定义;

步骤 3:右击项目,使用“添加”菜单下的“新建项…”菜单项添加模块定义文件,这时,模块定义文件会自动被配置到“DLL项目”属性下的“链接器”—“输入”配置项中的模块定义文件下;

步骤 4:在定义模块文件中,编写导出函数定义;如:

LIBRARY "MyISAPIExtension"

EXPORTS

GetExtensionVersion @1

HttpExtensionProc @2

TerminateExtension @3

(备注:三个导出函数被导出的时候不能被VC++编译器导出后函数名发生改变,所以使用定义模块文件对三个文件进行导出。或许可以使用extern “C” l加__declspec(dllexport)对三个导出函数进行导出操作;)

3. 配置空白DLL项目生成ISAPI筛选器(ISAPI Filter) DLL。

(同配置生成ISAPI 扩展一样,只是将ISAPI扩展的包含的头文件及三个筛选器导出函数配置替换成ISAPI筛选器的头文件httpfilt.h及三个筛选器导出函数的配置。)

四、在IIS7上ISAPI 的应用设置

1、 ISAPI扩展(ISAPI extension)的使用配置。

预先配置:

需要在IIS7的” Internet信息服务(IIS)管理器”上的全局配置中的“ISAPI和CGI限制”添加设置允许ISAPI模块文件路径;或设置“ISAPI和CGI限制”配置页面上右上角的“编辑功能设置”,选择“允许未指定的ISAPI模块”以确保要添加的ISAPI模块不会被禁用。

(1) 文件扩展名映射处理配置

1) 打开IIS7的” Internet信息服务(IIS)管理器”,点击所要配置的站点;

2) 在打开的站点配置主页的IIS组中选择“处理程序映射”,打开处理程序映射的配置页;

3) 在管理器窗口的右上角有个“操作”栏,选择“添加模块映射”。(该站点必须是绑定集成管道的应用程序池);

4) 在“添加模块映射”窗口的模块中选择“IsapiModule”,然后选择dll文件,并填写相应的配置信息;

5) 点击“请求限制…”按钮,选择“请求限制”对话框中的“访问”选项卡下的“执行”单选项,然后确定;

6) 最后“确认”添加映射模块。

(2) URL调用ISAPI扩展(ISAPI extension)方式设置,
调用如,在浏览器中直接输入: http://www.bizcn.com/MyIsapiExt.dll 进行isapi扩展的调用

如果按照“预选配置”的内容配置完”ISAPI和CGI限制”的配置内容之后,按以下步骤进行操作:

1) 打开IIS7的” Internet信息服务(IIS)管理器”,点击所要配置的站点;

2) 选择站点配置主页下的IIS配置组中的“处理程序映射”,打开站点的“处理程序映射”页;

3) 选择站点的“处理程序映射”配置页的右边“操作”栏中的“编辑功能权限”,打开“编辑功能权限”对话框;

4) 在“编辑功能权限”对话框中,选择“脚本”和“执行”两个复选框。

2、 ISAPI筛选器(ISAPI filter)的使用配置

选择要添加筛选器的站点,在站点的配置主页,选择“IIS”分组中的“ISAPI筛选器”。然后,在“ISAPI筛选器”的配置页面中右边的“操作”栏中点“添加…”;选择要配置的筛选器的DLL文件,填写相关的配置信息,然后确认添加。

(需要非常注意的一点是:你需要非常注意你的IIS的应用程序池帐户是否有对于ISAPI所在路径及ISAPI所要使用到的资源的各种权限。)

五、调试ISAPI

1、 调试操作步骤

因为ISAPI是一个dll文件,而且ISAPI是由IIS应用程序池进程调用的。

在IIS6及IIS7的应用 程序池的进程名称都是w3wp.exe;我们需要在单个应用程序池的机子上部署环境进行调试。避免调试时,多个应用程序池的一样的w3wp.exe进程名 称,导至不必要的调试麻烦。以下是进行ISAPI进行调试的操作步骤(ISAPI扩展和ISAPI 筛选器的调试方式一样):

步骤1 :根据isapi的应用设置设置好要测试的isapi的dll;

步骤2 :在浏览器的地址栏中输入配置测试isapi dll的站点的URL,然后过行一次访问,以便站点响应处理进程加载isapi dll文件。(如果是URL的方式访问isapi扩展的话,就要输入完整的isapi扩展dll访问的url);

步骤 3 :打开要测试的ISAPI的dll项目;

步骤 4 :选择主菜单的“工具”菜单下的“附加到进程…”的菜单项,弹出“附加到进程”对话框;

步骤 5 :选择“附加到进程”对话框下边的“显示所有会话中的进程”复选框,然后按“刷新”按刷;

步骤 6 : 在“可用进程”的列表中选择进程为:w3wp.exe的进程,最后按“附加”,将w3wp.exe进程附加到项目调试中;

步骤 7 :然要测试的ISAPI dll的函数HttpExtensionProc(或HttpFilterProc)内打上断点,再次刷新刚才在浏览器地址栏中输入的URL地址;这时程序就会停在打上断点的地方。

2、不能调试的可能情况:

a) 如果所编写的ISAPI中出现异常错误;可能直接导致应用程序停止进行。

b) 导出函数不是按原来的函数名导出,可能是编译的时候被VC++编译器改变函数名了。

c) 导出函数没有被正常导出。可以使用查看的dll导出函数工具进行查看导出的函数。

转载于:https://www.cnblogs.com/tonykan/p/3448100.html

相关文章:

iOS自定义转场动画

图1是最近闲着做的一个项目:午睡闹钟(欢迎到AppStore下载,截稿时最新版还在审核)的截图,把其中的转场动画效果简单封装了一下写了个demo(图2),demo的备注写的比较清楚,de…

Python中if语句练习题

####1、#####if-else语句 #elif和else都必须和if联合使用,不能单独使用 holidy_name 中秋节 if holidy_name 情人节: print 买玫瑰 print 看电影 elif holidy_name 圣诞节: print 吃大餐 elif holidy_name 生日: print 吃蛋糕 print 买礼…

开源:ASP.NET MVC+EF6+Bootstrap开发框架

前言 我在博客园潜水两三年了,在这里看过很多大神的文章,也学到了很多东西。可以说我是汲取着博客园的营养成长的。 想当年,我也是拿10个G的精神粮食从一个博客园大神那里换来一套开发框架,正式走上开发之路,到后来成为…

【iOS官方文档翻译】iOS的蓝牙连接、数据接收及发送

说明:苹果官方开发文档中涉及一些名词:Central(中心设备)、Peripheral(外围设备)、advertising(广告)、Services(服务)、Characteristic(特征&…

checkbox全选与反选

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><title>全选与反选</title><meta http-equiv"Content-Type" content"text/html;…

元组、列表及其特性

1、 #元组&#xff1a;带了紧箍咒的列表&#xff0c;不可直接修改元组内容 #元组本身不可变数据类型&#xff0c;没有增删改差 #元组内可以存储任意数据类型 t(1,2,3,4.2,star) print t,type(t) #元组内包含可变数组类型&#xff0c;可以间接修改元组内容 t1([1,2,3.3],4,5)…

JZOJ #4722 跳楼机 (最短路模型的完美转化)

题目描述&#xff1a; 给出$h,x,y,z$&#xff0c;求在$h$以内&#xff0c;$x,y,z$可以凑出多少个不同的数。$(1\leq{h}\leq{10^{18}},1\leq{x,y,z}\leq{10^5})$ 解题思路&#xff1a; 直接做显然不好做。我们考虑取$n$个$y$和$m$个$z$&#xff0c;然后再加上$x,2*x,3*x\cdots$&…

【C++】STL队列和栈的使用

C的STL标准模板库提供了队列和栈的基本操作。下面通过两个demo分别介绍STL队列和STL栈的使用。 Demo1&#xff1a;STL队列 【题目】卡片游戏&#xff08;题目来自刘汝佳《算法竞赛入门》&#xff09; 桌上又一叠牌&#xff0c;从第一张牌&#xff08;即位于顶面的牌&#xf…

mongodb的shell命令

MongoDB常用命令&#xff1a; 超级用户相关&#xff1a; use admin #增加或修改用户密码 db.addUser(ixigua,pwd) #查看用户列表 db.system.users.find() #用户认证 db.auth(ixigua,pwd) #删除用户 db.removeUser(mongodb) #查看所有用户 show users #查看所有数据库 show dbs …

字典、集合及其特性

1、 字典的定义 """ 字典是一个无序的数据集合&#xff0c;使用print输出字典的时候 通常输出的顺序和定义的顺序是不一致的 """ message { name:tom, age:18, height:1.80, weight:75.5 } print message s {} prin…

[HDOJ2819]Swap(二分图最大匹配, 匈牙利算法)

题目链接&#xff1a;http://acm.split.hdu.edu.cn/showproblem.php?pid2819 题意&#xff1a;给一张n*n的01矩阵&#xff0c;可以任意交换其中的行或者列&#xff0c;问是否可以交换出来一个对角线上都是1的矩阵。 按行列号建图&#xff0c;如果(i,j)为1的话&#xff0c;则i和…

脚本路径问题_dirname

pwd可获取命令当前的路径 可是若我们想在脚本中获取脚本所在文件夹的路径&#xff0c;这种方法是不够用的。 例如&#xff0c;我们的脚本放在/home/user/script/下&#xff0c;名字叫做getpath.sh getpath.sh有一行脚本是了local_path$(pwd) 现在我们在/home/user/下&#xff0…

【iOS官方文档翻译】iOS蓝牙的基本概念

之前写了【iOS官方文档翻译】iOS的蓝牙连接、数据接收及发送一文&#xff0c;介绍了怎样进行蓝牙通讯&#xff0c;但是很多基本概念没有进行解释&#xff0c;看起来可能有点吃力&#xff0c;所以现在再翻译一篇苹果对官方蓝牙4.0一些基本概念介绍的文章。 1.中心设备和外围设备…

元组、列表、字典及集合练习

列表练习题&#xff1a; #假定有下面这样的列表: #names [lily, denny, jenny, apple] #输出结果为:I have lily,denny, jenny and apple. names [lily, denny, jenny, apple] print I have ,.join(names[:-1]) and names[-1] 2、后台管理前台会员信息 要求&#…

【iOS】sqlite3的使用(増删改查)

目录&#xff1a; 一、sqlite3常用函数 二、将sqlite3集成到项目&#xff0c;实现増删改查 三、封装DBManager 四、Demo 一、sqlite3常用函数及解释 &#xff08;1&#xff09;sqlite3_open: 用来创建和打开数据库文件&#xff0c;接收两个参数&#xff0c;第一个是数据库…

网上搜集了点资料,学web的人互相分享共同进步吧(php编码的好习惯必须养成)...

网上搜集了点资料&#xff0c;学web的人互相分享共同进步吧 一、优秀的代码应该是什么样的&#xff1f; 优秀的PHP代码应该是结构化的。大段的代码应该被分割整理成一个个函数或方法&#xff0c;而那些不起眼的小段代码则应该加上注释&#xff0c;以便日后清楚它们的用途。而且…

div模拟textarea文本域轻松实现高度自适应——张鑫旭

by zhangxinxu from http://www.zhangxinxu.com本文地址&#xff1a; http://www.zhangxinxu.com/wordpress/?p1362 一、关于textarea文本域以及高度自适应 textarea标签为表单元素&#xff0c;一般用在多行文字的输入。在web应用上常见的是评论输入框&#xff0c;微博信息输入…

【iOS】Mapkit的使用:地图显示、定位、大头针、气泡等

以前做项目用高德地图SDK&#xff0c;需要注册账号和AppID&#xff0c;然后下载SDK集成到项目中&#xff0c;比较麻烦&#xff0c;这几天看了下苹果自带的MapKit框架&#xff0c;感觉挺好用&#xff0c;官方文档也介绍得很详细&#xff0c;所以按照官方文档写了个demo&#xff…

java.lang.NoSuchMethodError: org.springframework.core.io.ResourceEditor错误

一般是jar包冲突&#xff0c;或者某些jar包版本不同。 如上&#xff0c;spring其他包的版本均为4.2.5&#xff0c;而spring-webmvc的jar包为1.2.6版本&#xff0c;造成版本冲突。 把该包版本改为4.2.5&#xff0c;宣告成功&#xff01; 转载于:https://www.cnblogs.com/toSeeMy…

SDUTOJ 1293 乘积最大的分解(数论)

乘积最大的分解思路&#xff1a; 让分解出来的因子有尽可能多的3&#xff0c;剩下的用2补全。 最开始思路错了&#xff0c;WA了好长时间 &#xff01; 函数中n 1的情况应该是不用&#xff0c;经测试数据中没有这组。 *注意用 long long 99的时候会超int的数据范围 1 #include …

列表及字典生成式

列表生成式&#xff1a; 列表生成式就是一个用来生成列表的特定语法形式的表达式。 语法格式&#xff1a; [exp for iter_var in iter] 迭代iter中的每个元素&#xff1b; 每次迭代都先把结果赋值给iter_var&#xff0c;然后通过exp得到一个新的计算值&#xff1b; 最后把…

[SQL基础教程] 1-5 表的删除和更新

[SQL基础教程] 1-5 表的删除和更新 表的删除 语法DROP TABLE <表名>; 法则 1-12 删除的表无法恢复 表定义的更新 语法ALTER TABLE<表名> ADD COLUMN<列的定义>; // 添加列 ALTER TABLE<表名> DROP COLUMN<列的定义>; // 删除列 ps: **Oracle、SQ…

【iOS】自定义控件入门:可拖动的环形进度

有时候UIKit的标准控件并不能满足我们的需求&#xff0c;因此我们可以通过自定义控件得到满足我们需求的控件&#xff0c;例如这篇文章将教你如何自定义一个圆形的进度条&#xff0c;并且用户可以通过拖动进度条上的手柄来改变进度值。主要参考了这篇文章&#xff1a;HOW TO BU…

在.NET2.0中解析Json和Xml

在.NET2.0中解析Json和Xml 在.NET解析json有很多方法&#xff0c;这里介绍最简单也用的最多的一种。 一、添加引用 解析Json&#xff0c;先下载开源控件 Newtonsoft.Json.dll 下载地址&#xff1a;http://files.cnblogs.com/gosky/Newtonsoft.Json%E9%9B%86%E5%90%88.zip 解压以…

虚拟机的基本操作

1、用户界面 [kioskfoundation156 Desktop]$ kiosk #打开shell的用户 #分隔符 foundation156 #主机名称 Desktop #工作目录名称 $ ##身份提示符&#xff0c;#表示超级用户&#xff0c;$表示普通用户 特别注意&a…

strong assign属性

strong:这要求运行时自动地保留对这个对象的引用。换而言之&#xff0c;ARC&#xff08;Automatic Reference Counting&#xff09;在运行时会一直把这个对象保留在内存里&#xff0c;直到它不再被任何其他对象引用。之后&#xff0c;其所占的内存会被自动释放。assign:表示这…

iOS7的界面上移问题

第一种方法&#xff1a;修改BaseSDK XCode5的默认BaseSDK是iOS7&#xff0c;所以要修改成工程文件创建时的BaseSDK。但是XCode5中默认只带有iOS7的SDK&#xff0c;所以要想能做到更改SDK&#xff0c;我们就要添加旧的SDK。 1.从苹果开发者中心下载旧版本XCode&#xff0c;https…

【Android】ActionBar的使用(1)

前&#xff08;fei&#xff09;言&#xff08;hua&#xff09;&#xff1a;转行iOS开发半年&#xff0c;很久没接触Android了&#xff0c;前几天去上课&#xff0c;听着实在无聊&#xff0c;随手拿了同学的一本《Android UI设计》&#xff0c;发现有好多基础知识自己虽然用过&a…

装饰器及例题分析

知识点&#xff1a; 装饰器的定义&#xff1a; - 装饰器的实现是函数里面嵌套函数; - 装饰器的本质是一个函数&#xff0c; 它可以让其他函数在不需要做任何代码改动的前提下增加额外的功能; - 装饰器需要传递一个函数&#xff0c; 返回值也是一个函数对象. 1、map函数 def …

iOS开发系列--让你的应用“动”起来

概览 在iOS中随处都可以看到绚丽的动画效果&#xff0c;实现这些动画的过程并不复杂&#xff0c;今天将带大家一窥iOS动画全貌。在这里你可以看到iOS中如何使用图层精简非交互式绘图&#xff0c;如何通过核心动画创建基础动画、关键帧动画、动画组、转场动画&#xff0c;如何通…