fmpdam简介
这是一个使用isapi编写的http服务程序,以IsapiModule出现,依附于iis的w3wp.exe进程处理uri扩展名为*.fmpps的http请求的名为fmpdam(fast message passing database access middleward )的数据库访问中间件。
该中间件具备传统web service接口的所有优点,同样可隔离客户程序和数据库间的耦合并保证数据访问过程安全可靠。由于制定了专属协议,该中间件相较传统web service接口还有更加规范、统一的通信和错误处理机制,使得客户端能够使用一种方法处理所有web service接口的返回结果,不必再针对返回不同格式的web service接口作不同处理,近而减少整个项目的开发任务。
fmpdam服务允许使用扩展名为.fmpps的ini文件格式的脚本文件配置fmpdam服务面对不同请求时的行为,达到在不编写或只编写少量代码的情况下产出能够满足用户需求的web service接口目的;下例展示了为满足“读取用户昵称”之需求所需编写的代码:
以上fmpps文件描述的语义为:通过名为MySQL的数据源连接数据库,带入客户提交的UserName参数执行“SELECT NickName FROM `User`where `UserName`=‘用户提交的UserName参数’”语句并向用户发回执行结果。
其中,PrepareStatement键的值还可以是一个存储过程或任何SQL语句。而DSN键的值可以是指向任何数据库的用户、系统或文件DSN,当然,也可以是任何符合ODBC之规范的连接字符串。
由于fmpps文件事先被编译并存储在服务器上,且使用了参数化查询,所以,并不存在SQL注入风险。在尚未开发完成的fmpdam1.3版本中还支持使用vbs和jscript以及javascript处理客户请求,近一步增加fmpdam实用性和灵活性。
以Windows Server2008 +IIS7为例,说明如何部署fmpdam服务
-
从此https://pan.baidu.com/s/1dFJEk1N下载fmpdam并解压到IIS的运行目录得到fmpdam文件夹。
-
安装fmpdam文件夹中的Visual C++ 2017 Redistributable Package.x86.exe。
-
打开IIS管理器,在左侧连接视图中网站节点下选中你要安装到的网站。
-
在IIS管理器右侧功能视图中双击处理程序映射图标,并在IIS管理器最右侧的操作视图中点击添加模块映射打开添加模块映射窗口。
-
在添加模块映射窗口的请求路径、模块和名称分别输入“*.fmpps”(不含双引号)、IsapiModule和fmpdam-dll并在可执行文件一栏中填入fmpdam(第1步解压得到的)文件夹里的fmpdam.dll的路径。然后点击访问限制按扭->选中访问选项卡->选中执行单选项并点击确定按扭,回到添加模块映射窗口再点击确定按扭。
-
在处理映射程序列表中找到刚添加的名称列为fmpdam-dll的项,右击在弹出的菜单中选中编辑功能权限…并在弹出的编辑功能权限对话框中勾选脚本和执行,然后点击确定按扭。
-
在IIS管理器左侧连接视图中网站节点下找到你要安装到的网站并右击,在弹出的菜单中选择管理网站->高级设置 记下常规节点下的应用程序池的名称(假设为DefaultWeb Site)。
-
在IIS管理器左侧连接视图中选中应用程序池节点,在右侧的应用程序池列表中找到Default Web Site并右击,在弹出的菜单中选择高级设置并将弹出的高级设置对话框下的常规->启用32位应用程序项的值设置为True,然后点确定按扭。
-
重启网站和应用程序池,使设置生效。
-
在网站根目录下创建一个a.fmpps内容为空的文件。并在浏览器中访问:http://127.0.0.1/a.fmpps (视网站绑定的地址而定),如果浏览器显示“未找到“***\a.fmpps”接口的文档“表示已正确安装了fmpdam服务,现在可以使用fmpps文件处理客户请求了。
使用fmpps文件处理客户请求
关于如何安装配置MySQL和ODBC驱动我不再在此复述。在此假设你的服务器上已安装了MySQL和MySQL的32位ODBC驱动程序,且在32位(或WOW64)的ODBC数据源系统DSN列表中包括了一个名为MySQL的DSN,此DSN指向名为test的库并设置了该DSN字符集为utf8。那么,现在参照下图在test库中建立Student表,并写入下图中的数据:
然后编辑 a.fmpps,写入以下内容并保存(fmpps文件中PrepareStatement键的值还可以是存储过程):
[QueryAge]
DSN=MySQL
ReturnResult=TRUE
PrepareStatement=Select Age From Student WhereName=?
?1=Name,10
发送以下报文到网站(假设网站IP为127.0.0.1):
POST http://127.0.0.1/a.fmpps HTTP/1.1
Content-Type:application/x-www-form-urlencoded; Charset=utf-8
User-Agent:TestAgent
Host:127.0.0.1
Content-Length:8
Name=Jim
将得到以下响应报文:
其中,选定部分是由fmpdam协议(参考:http://blog.csdn.net/passfuhao/article/details/78811667)组成的查询结果。
fmpps文件格式说明
fmpps 文件用于存储经过预编译的SQL语句并描述fmpdam应该在执行参数化查询时如何绑定参数。单个fmpps文件可存储多个SQL语句并且允许每个语句对应不同的DSN,在一些需要多库联查时可能需要此功能。
注意:
Fmpps文件必须以UTF8编码保存。
图解fmpps文件结构
附:
在fmpdam1.3版本中fmpps文件格式升级为1.1格式,PrepareStatement键可以指向一个vbs或js脚本文件(允许使用vbs、jscript或javascript处理用户请求),该键指向的脚本文件中代码用以处理针对fmpps文件的请求。当针对fmpps的请求到来时,fmpdam服务程序将以cscript.exe为宿主进程(fmpdam服务会模拟完整的cscript.exe环境,开发者可以假设是以cscript.exe为宿主进程的,但考虑到效率问题,事实并非如此),加载脚本,随后向宿主进程的标准输入流中分块写入客户端发来的HTTP请求报文,脚本运行完毕后(或过程中)需要向宿主进程的标准输出流写入fmpdam协议格式的响应结果,fmpdam服务将负责将结果封装成HTTP响应报文格式回应给客户端。
目前fmpdam1.3版尚未开发完成,不知能否有后续。