Biztalk发布web服务时遭遇'SoapExceptionInternal SOAP Processing Failure'错误
一.???? 項目描述
使用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
轉載于:https://www.cnblogs.com/chnking/archive/2006/06/10/422639.html
總結
以上是生活随笔為你收集整理的Biztalk发布web服务时遭遇'SoapExceptionInternal SOAP Processing Failure'错误的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Net中常见问题及解决方法整理
- 下一篇: 收藏:Asp.net中基于Forms验证