一. 項目描述
使用biztalk2006在vs2005開發環境中做一個簡單的測試商務程序,主要是測試使用biztalk發布一個web services,這個web services接受使用者發送的請求,然後根據使用者要求通過sql adapter到sql server資料庫中提取相關資料,最後作為web services的response返回給使用者。
商務程序如下:
圖中,Port_2是雙向接收埠,就是這個連接埠需要發布為web services,Port_1是一個用sql adapter嚮導做的雙向傳送埠,使用的是預存程序,參數只有一個Rows,指示需要擷取的資料行數,預存程序返回Rows要求行數的資料。
相應的Schema也很簡單:
Biztalk項目做好後,編譯,部署,一切順利。
在biztalk管理器中,在這個應用程式中添加物理髮送連接埠,指向相應的資料庫連接,指定返回的Schema類型,綁定了Port_1邏輯連接埠。
最後用biztalk web services發布嚮導做Port_2連接埠的web services的發布設定。按照嚮導的指示一步步的做,其中有一步需要選擇是否將此web services指定給某個應用程式的接收位置,在這裡選擇作為本應用程式的接收位置,這樣就將要產生的web services跟Port_2連接埠進行了綁定。
在biztalk管理器中啟動這個應用程式,啟動正常。
二. 問題現象
建立一個winform的應用,引用上面過程中發布的web services,引用後在項目中產生這個web services代理類,擁有一個叫做Operation_1的方法,這個方法就是Port_2連接埠定義的操作名。
在介面上放置一個button,在這個button的點擊事件中,建立一個web services代理類的執行個體,建立一個Operation_1方法的參數的執行個體,之後調用Operation_1方法,接收Operation_1方法的傳回值。
以上是測試情境,調用Operation_1方法的代碼處設定一個斷點,調試執行這個winform應用程式,點擊button,程式在調用Operation_1方法處遇到斷點中斷,這時進行單步調試,程式執行調用Operation_1方法,實際就是調用web services的操作,結果返回一個錯誤:SOAP內部處理失敗(SoapException: Internal SOAP Processing Failure)。同時在事件檢視器中有以下的錯誤提示:
l 使用者 'NT AUTHORITY\NETWORK SERVICE' 登入失敗。
l 試圖串連到伺服器“JINJZ2003”上的“BizTalkMgmtDb”SQL Server 資料庫失敗。 錯誤:“無法開啟登入所請求的資料庫 "BizTalkMgmtDb"。登入失敗。”
(An attempt to connect to "BizTalkMgmtDb" SQL Server database on server "Server" failed with error: "Cannot open database requested in login 'BizTalkMgmtDb'. Login fails.".)
l 訊息引擎無法註冊接收位置“/BiztalkSqlSP_Proxy/BiztalkSqlSP_Orchestration_1_Port_2.asmx”的“SOAP”的適配器。請驗證接收位置存在,且獨立的適配器在可以訪問 BizTalk 資料庫的帳戶下運行。
(The Messaging Engine failed to register the adapter for "SOAP" for the receive location "/VirtualDirectory/Name.asmx". Please verify that the receive location is valid, and that the isolated adapter runs under an account that has access to the BizTalk databases.)
三. 解決過程
根據錯誤提示,到微軟的支援網站查詢,果然有這個錯誤的相關說明和處理方法,是因為web services對應的應用程式集區的帳戶不是BizTalk Isolated Host Users組的成員。 BizTalk Isolated Host Users組具有對'BizTalkMgmtDb'資料庫的存取權限。同時這個帳戶也必須是IIS_WPG組的成員。
查看了IIS中這個web services對應的應用程式集區是DefaultAppPool,DefaultAppPool對應的帳戶是網路服務(network service),在IIS_WPG組中有network service帳戶,可是在BizTalk Isolated Host Users組中沒有network service帳戶,於是在BizTalk Isolated Host Users組中加入network service帳戶。測試,故障依舊,在事件檢視器中依然有錯誤提示:network service無法登入'BizTalkMgmtDb'資料庫。真是有點奇怪。
將DefaultAppPool對應的帳戶改為“IWAM_機器名”,同時也把“IWAM_機器名”加入到BizTalk Isolated Host Users組和在IIS_WPG組,然後重新啟動IIS,再進行測試。依然有錯誤,不過這次錯誤提示不是原來的“SoapException: Internal SOAP Processing Failure”,改成了“System.Web.Services.Protocols.SoapException: 伺服器無法處理請求。 ---> System.InvalidOperationException: 無法產生臨時類(result=1)。\nerror CS2001: 未能找到源檔案“C:\\WINDOWS\\TEMP\\zyobqxbr.0.cs()”
看來資料庫存取權限的問題解決了,查看事件檢視器也沒有了資料訪問的錯誤記錄。就新產生的錯誤去查微軟支援網站,找到相關內容,說web services對應的應用程式集區的帳戶需要對%systemroot%\Temp檔案夾有讀寫權限,因為Web service (.asmx)檔案的JIT會在%systemroot%\Temp檔案夾編譯產生DLL檔案,如果應用程式集區的帳戶沒有%systemroot%\Temp檔案夾的讀寫權,就不能產生相關的dll檔案。
按此說明,設定給“IWAM_機器名”帳戶讀寫%systemroot%\Temp檔案夾的讀寫權,再測試,OK,成功,Operation_1方法成功的返回的預期的結果。
參考文檔:
1. BizTalk Server 2004 和 Web 服務:http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/BTS2004WP5cab05ab.mspx?mfr=true
2. You cannot call an orchestration that is exposed as a Web service on a server that is running BizTalk Server 2004:http://support.microsoft.com/?kbid=910295