webserver com+遇到的問題

最近正在Delphi2007開發一個Web Service,由於系統不僅要在Intranet中使用,還要在Internet中使用,如果服務端用COM+的話客戶端的分發、防火牆的透過、安全部署等等都是非常難以解決的問題,而如果單純使用Web Service又不能使用MS SQL Server的Pooling,用戶數一多的話服務器的負荷可能會很大,而且很有可能當機,如果真發生這種的情況的話,基本上這個項目就要掛了,因此在選擇服務端的開發框架的問題上,決定採用Web Service加COM+的模式,由於Web Service採用的XML+SOAP+TCP的技術,可非常方便的透過防火牆,而且客戶端既可以是基於WinForm的CGI又可以是基於瀏覽器的BS,便於在Internet上部署。

  但在開發過程中發現一件讓我非常痛苦不已的事情。事情是這樣的:[separator]

  COM+:New-->Other-->ActiveX-->ActiveX Library,先建立COM+應用程序,然後再New-->Other-->Multiter-->Transactional Data Module,建立支持事務的數據模板窗體,並這個數據窗體中加入所需的AdoConnection、AdoDataSet、DataSetProvider、ClientDataSet,AdoConnection連接到本機的SQL Server 2000,由於數據庫在本機我在ConnectionString的碼中選擇了“使用Windows NT集成安全設置”,在OnCreate事件中設置打開AdoConnection的連接,在OnDestory中關閉AdoConnection的連接(這樣也是爲了使用DB的Pooling)。

  建立DUnit測試單元,測試OK!建立一個直連COM+服務器的測試客戶端,測試,OK!

  建立Web Service應用程序,爲了調試的方便先建立一個WAD類型的服務器,用客戶端測試,OK!似乎一切都沒問題!

  於是把Web Service改爲CGI/ISAPI模式,加入客戶端,測試,。。。。。沒響應!Ctrl+F2強行退出Client,再測,又掛了,而且COM+和Web Service進程一直掛在內存中,必須重啓機器或重啓IIS才能退出來,再測試,再掛。因CGI/ISAPI類型的Web Service不能直接進入Debug狀態,認爲可能是自已某個地方寫錯了,重寫!再一次測試!還是沒響應!不信,再重寫!這一次一個字符一個字符仔仔細細再檢查了一遍,再測,客戶端還是沒響應!沒道理呀,用Dunit做了測試用例,用客戶端直連COM+都是好的呀!看來問題還是出在Web Service上,增加一個接口(函數),不讓它連接COM+,測試,OK!暈了,客戶端連接COM+,是好的,客戶端連Web Service,也是好的,但是讓客戶端一連接Web Service中要從COM+取得數據的接口立馬就掛了。難道是Web Service中連接COM+的語句寫錯了?但在WAD模式是測試通過了的呀!先不管,再把在客戶端連接COM+中測試通過的Code拷貝過去,編譯,再試,又掛了!我的天了,就這樣如此這般這般如此反覆,6個小時過去了,仍無頭緒。

  要是Web Service能進入調試就好了,沒撤,再把CGI類型改回WAD類型,測試,沒問題!再測試,。。。等等,也掛了!不過WAD拋出了一個異常:“用戶 'XXX-LMM\IUSR_XXX-LMM' 登錄失敗。”....,沒在意!斷續痛苦中。。。。。

  睡覺去,滿腦Code,滿腦的無響應畫面!

  第二天,繼續調試,WAD仍然拋出“用戶 'XXX-LMM\IUSR_XXX-LMM' 登錄失敗。”的異常,想想,沒道理呀,我又沒用IUSR_XXX-LMM這一用戶名登錄數據庫爲什麼會提示登錄失敗呢(XXX-LMM是我的計算機名)?而且我在COM+和客戶直連COM+中都測試過了的呀!找煙、取煙、點菸,打不着火,再打,還是打不着火,換個打火機,終於點着,噓,等等。。。終於明白了,在COM+中測試時當我們“使用Windows NT集成安全設置”時使用的用戶是Windows的登錄用戶也就是Adminitrator用戶,而這一用戶正好是MS SQL Server的系統用戶,當然可以登錄SQL Server了,用客戶端直連COM+時也是一樣的道理,而當我們的客戶端通過Web Service連接COM+時,COM+默認Web Service的默認用戶是IUSR_XXX-LMM,而這一用戶並不是SQL Server的有效用戶,當然無法連接數據庫了……想到這裏,就一個字:“改”!果然,一切煙消雲散,正常無比!那時的心情也只有一個字:爽!

  通過這一事件,對Web Service加COM+的開發模式,本人有以下幾點經驗值得分享:

  1、Web Service + COM+的開發模式是大勢所趨,好處多多。
  2、COM+中的數據庫連接(MSSQL)請千萬要用Windows+SQL混合認證模式,不要認爲在COM+中測試通過了就一定沒有問題。
  3、AdoConnection中的KeepConnection請設爲False。
  4、在COM+應儘量使用ClientDataSet的XMLData而不是Data,要不然的話就要自已EnCode64/DeEnCode64了。
  5、HTTPRIO儘量設置URL而不是WSDLLocation。
  6、在使用ISAPI類型的Web Service中,接口中要包含CoInitialize(nil);.....CoUninitialize; CoInitialize在ActiveX單元中,要包含進來。
  7、好好利用DUnit吧
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章