據(jù)庫(kù)訪問(wèn)中間件)
fmpdam簡(jiǎn)介這是一個(gè)使用isapi編寫(xiě)的http服務(wù)程序以IsapiModule出現(xiàn)依附于iis的w3wp.exe進(jìn)程處理uri擴(kuò)展名為*.fmpps的http請(qǐng)求的名為fmpdam(fast message passing database access middleward )的數(shù)據(jù)庫(kù)訪問(wèn)中間件。該中間件具備傳統(tǒng)web service接口的所有優(yōu)點(diǎn)同樣可隔離客戶程序和數(shù)據(jù)庫(kù)間的耦合并保證數(shù)據(jù)訪問(wèn)過(guò)程安全可靠。由于制定了專屬協(xié)議該中間件相較傳統(tǒng)web service接口還有更加規(guī)范、統(tǒng)一的通信和錯(cuò)誤處理機(jī)制使得客戶端能夠使用一種方法處理所有web service接口的返回結(jié)果不必再針對(duì)返回不同格式的web service接口作不同處理近而減少整個(gè)項(xiàng)目的開(kāi)發(fā)任務(wù)。fmpdam服務(wù)允許使用擴(kuò)展名為.fmpps的ini文件格式的腳本文件配置fmpdam服務(wù)面對(duì)不同請(qǐng)求時(shí)的行為達(dá)到在不編寫(xiě)或只編寫(xiě)少量代碼的情況下產(chǎn)出能夠滿足用戶需求的web service接口目的下例展示了為滿足“讀取用戶昵稱”之需求所需編寫(xiě)的代碼以上fmpps文件描述的語(yǔ)義為通過(guò)名為MySQL的數(shù)據(jù)源連接數(shù)據(jù)庫(kù)帶入客戶提交的UserName參數(shù)執(zhí)行“SELECT NickName FROM Userwhere UserName‘用戶提交的UserName參數(shù)’”語(yǔ)句并向用戶發(fā)回執(zhí)行結(jié)果。其中PrepareStatement鍵的值還可以是一個(gè)存儲(chǔ)過(guò)程或任何SQL語(yǔ)句。而DSN鍵的值可以是指向任何數(shù)據(jù)庫(kù)的用戶、系統(tǒng)或文件DSN當(dāng)然也可以是任何符合ODBC之規(guī)范的連接字符串。由于fmpps文件事先被編譯并存儲(chǔ)在服務(wù)器上且使用了參數(shù)化查詢所以并不存在SQL注入風(fēng)險(xiǎn)。在尚未開(kāi)發(fā)完成的fmpdam1.3版本中還支持使用vbs和jscript以及javascript處理客戶請(qǐng)求近一步增加fmpdam實(shí)用性和靈活性。以Windows Server2008 IIS7為例說(shuō)明如何部署fmpdam服務(wù)從此百度網(wǎng)盤(pán)-鏈接不存在下載fmpdam并解壓到IIS的運(yùn)行目錄得到fmpdam文件夾。安裝fmpdam文件夾中的Visual C 2017 Redistributable Package.x86.exe。打開(kāi)IIS管理器在左側(cè)連接視圖中網(wǎng)站節(jié)點(diǎn)下選中你要安裝到的網(wǎng)站。在IIS管理器右側(cè)功能視圖中雙擊處理程序映射圖標(biāo)并在IIS管理器最右側(cè)的操作視圖中點(diǎn)擊添加模塊映射打開(kāi)添加模塊映射窗口。在添加模塊映射窗口的請(qǐng)求路徑、模塊和名稱分別輸入“*.fmpps”不含雙引號(hào)、IsapiModule和fmpdam-dll并在可執(zhí)行文件一欄中填入fmpdam第1步解壓得到的文件夾里的fmpdam.dll的路徑。然后點(diǎn)擊訪問(wèn)限制按扭-選中訪問(wèn)選項(xiàng)卡-選中執(zhí)行單選項(xiàng)并點(diǎn)擊確定按扭回到添加模塊映射窗口再點(diǎn)擊確定按扭。在處理映射程序列表中找到剛添加的名稱列為fmpdam-dll的項(xiàng)右擊在彈出的菜單中選中編輯功能權(quán)限…并在彈出的編輯功能權(quán)限對(duì)話框中勾選腳本和執(zhí)行然后點(diǎn)擊確定按扭。在IIS管理器左側(cè)連接視圖中網(wǎng)站節(jié)點(diǎn)下找到你要安裝到的網(wǎng)站并右擊在彈出的菜單中選擇管理網(wǎng)站-高級(jí)設(shè)置 記下常規(guī)節(jié)點(diǎn)下的應(yīng)用程序池的名稱假設(shè)為DefaultWeb Site。在IIS管理器左側(cè)連接視圖中選中應(yīng)用程序池節(jié)點(diǎn)在右側(cè)的應(yīng)用程序池列表中找到Default Web Site并右擊在彈出的菜單中選擇高級(jí)設(shè)置并將彈出的高級(jí)設(shè)置對(duì)話框下的常規(guī)-啟用32位應(yīng)用程序項(xiàng)的值設(shè)置為T(mén)rue然后點(diǎn)確定按扭。重啟網(wǎng)站和應(yīng)用程序池使設(shè)置生效。在網(wǎng)站根目錄下創(chuàng)建一個(gè)a.fmpps內(nèi)容為空的文件。并在瀏覽器中訪問(wèn)http://127.0.0.1/a.fmpps 視網(wǎng)站綁定的地址而定如果瀏覽器顯示“未找到“***\a.fmpps”接口的文檔“表示已正確安裝了fmpdam服務(wù)現(xiàn)在可以使用fmpps文件處理客戶請(qǐng)求了。使用fmpps文件處理客戶請(qǐng)求關(guān)于如何安裝配置MySQL和ODBC驅(qū)動(dòng)我不再在此復(fù)述。在此假設(shè)你的服務(wù)器上已安裝了MySQL和MySQL的32位ODBC驅(qū)動(dòng)程序且在32位或WOW64的ODBC數(shù)據(jù)源系統(tǒng)DSN列表中包括了一個(gè)名為MySQL的DSN此DSN指向名為test的庫(kù)并設(shè)置了該DSN字符集為utf8。那么現(xiàn)在參照下圖在test庫(kù)中建立Student表并寫(xiě)入下圖中的數(shù)據(jù)然后編輯 a.fmpps寫(xiě)入以下內(nèi)容并保存fmpps文件中PrepareStatement鍵的值還可以是存儲(chǔ)過(guò)程[QueryAge]DSNMySQLReturnResultTRUEPrepareStatementSelect Age From Student WhereName??1Name,10發(fā)送以下報(bào)文到網(wǎng)站假設(shè)網(wǎng)站IP為127.0.0.1POSThttp://127.0.0.1/a.fmppsHTTP/1.1Content-Type:application/x-www-form-urlencoded; Charsetutf-8User-Agent:TestAgentHost:127.0.0.1Content-Length:8NameJim將得到以下響應(yīng)報(bào)文其中選定部分是由fmpdam協(xié)議參考fmpdam1.2協(xié)議報(bào)文格式說(shuō)明_keyvalue報(bào)文格式_穿女裝的程序員的博客-CSDN博客組成的查詢結(jié)果。fmpps文件格式說(shuō)明fmpps 文件用于存儲(chǔ)經(jīng)過(guò)預(yù)編譯的SQL語(yǔ)句并描述fmpdam應(yīng)該在執(zhí)行參數(shù)化查詢時(shí)如何綁定參數(shù)。單個(gè)fmpps文件可存儲(chǔ)多個(gè)SQL語(yǔ)句并且允許每個(gè)語(yǔ)句對(duì)應(yīng)不同的DSN在一些需要多庫(kù)聯(lián)查時(shí)可能需要此功能。注意Fmpps文件必須以UTF8編碼保存。圖解fmpps文件結(jié)構(gòu)附在fmpdam1.3版本中fmpps文件格式升級(jí)為1.1格式PrepareStatement鍵可以指向一個(gè)vbs或js腳本文件允許使用vbs、jscript或javascript處理用戶請(qǐng)求該鍵指向的腳本文件中代碼用以處理針對(duì)fmpps文件的請(qǐng)求。當(dāng)針對(duì)fmpps的請(qǐng)求到來(lái)時(shí)fmpdam服務(wù)程序?qū)⒁詂script.exe為宿主進(jìn)程fmpdam服務(wù)會(huì)模擬完整的cscript.exe環(huán)境開(kāi)發(fā)者可以假設(shè)是以cscript.exe為宿主進(jìn)程的但考慮到效率問(wèn)題事實(shí)并非如此加載腳本隨后向宿主進(jìn)程的標(biāo)準(zhǔn)輸入流中分塊寫(xiě)入客戶端發(fā)來(lái)的HTTP請(qǐng)求報(bào)文腳本運(yùn)行完畢后或過(guò)程中需要向宿主進(jìn)程的標(biāo)準(zhǔn)輸出流寫(xiě)入fmpdam協(xié)議格式的響應(yīng)結(jié)果fmpdam服務(wù)將負(fù)責(zé)將結(jié)果封裝成HTTP響應(yīng)報(bào)文格式回應(yīng)給客戶端。目前fmpdam1.3版尚未開(kāi)發(fā)完成不知能否有后續(xù)。