如何在Windows Server 2008中使用Web網站或WebService連接SAP系統


      連接SAP系統,並獲取相關數據使用WinForm很容易就成功了,但是相同的代碼移植到WEB中,卻總是無法正常連接,時不時的就會有錯誤出現。解決這個問題花了比較長的時間,所以想在這里與大家分享一下我這菜鳥的經驗,有什么不足希望各位大俠批評指正,謝謝。現在開始進入正題  

1 環境說明

       詳見表1-1所示。

1-1 環境說明

開發環境

開發工具

1. 操作系統:Windows Server 2008R2 64bit;

2. Framework: dot net Framework 3.5;

3. 3rd DLL(NCO3.0) SAP DLL是32bit的,而不是64bit。

Visual Studio 2010 旗艦版 64bit

       關於環境需要說明的一點是SAP DLL為什么使用32bit?

       利用Visual Studio的開發連接SAP系統的項目,需要使用第三方動態鏈接庫(dll),我們在Windows Server 2008 64bit的操作系統中,很自然的會想到應該使用64bit的SAP DLL,如果只是獲取SAP數據,然后更新到我們現有的系統中,可以使用客戶端程序或者WinForm程序,這個是沒有任何問題的。

       但是同樣的代碼,當我們使用WEB進行發布調試的時候,就會有問題,對應的頁面會冒紅,說無法加載sapnco.dll文件。后來經過資料查詢以及實驗,我們得出一個結論就是:

使用WEB連接SAP系統時,我們應該使用32位的SAP DLL作為第三方引用,所以可以在開發環境中添加一個32bit的SAP DLL文件。

2 成功部署網站連接SAP系統

       本節將通過問題解決的方式來講解我們應該如何成功部署一個網站來,連接到SAP系統,並成功獲取到SAP系統中的數據,供我們使用。

2.1  未能加載程序集”sapnco”

      當我們建立好一個WEB工程,編寫好了連接SAP系統的代碼后我們會很自然的去調試,看看我們寫的是否正確。假設代碼寫的非常好且沒有錯誤,經過調試發現我們想要的結果都能夠成功的在頁面中顯示出來,很自然的我們會認為原來這東西如此簡單,我們就搞定它了。可是奇怪的事情是,當我們發布部署這個工程后,發現無論如何網頁都會冒紅,出現圖4-1所示的錯誤。

  2-1 未能加載程序集sapnco

      怎么辦? 一般情況下,在64bit的開發環境中開發項目,編譯項目對應的目標平台都會是Any CPU,而我們這個項目中引用的SAP DLL,它是32bit的,所以我們必須將目標平台改為x86。

2.2    未能加載文件“我們的項目名”

經過上面的修改后,我們經過編譯部署,刷新后,在此打開網頁的時候,依然會報錯誤,這個錯誤和上述錯誤差不多,只是未能加載文件后面的內容有所改變,詳見圖4-2所示。

 

2-2 未能加載文件“LgortWebApplication

      比較圖2-1和圖2-2的錯誤,從表面現象來看問題的性質是一樣的,從而會誤導我們覺得該目標平台是沒有用的,很有可能會同一個方向去搜尋答案的,從而會做無用功。我們仔細看看圖2-2所示的異常信息說明(也可以參考圖2-3的內容)。

 

圖2-3 異常信息說明

       關於這個異常信息,微軟的官方解釋如下:

      (1) 如果您的應用程序使用了 32 位組件,請確保該應用程序始終采用 32 位應用程序的運行方式。

      如果應用程序項目的“平台目標”屬性設置為 AnyCPU,則編譯后的應用程序在 64 位或 32 位模式中均可運行。 如果采用 64 位應用程序運行方式,則實時 (JIT) 編譯器便會生成 64 位本機代碼。 如果應用程序依賴於某個 32 位托管組件或非托管組件,則在 64 位模式中無法加載該組件。 若要糾正此問題,請將項目的“平台目標”屬性設置為 x86,然后重新編譯。

      (2) 確保未使用利用其他 .NET Framework 版本創建的組件。

       如果使用 .NET Framework 1.0 或 .NET Framework 1.1 開發的應用程序或組件嘗試加載使用 .NET Framework 2.0 SP1 或更高版本開發的程序集,或者使用 .NET Framework 2.0 SP1 或 .NET Framework 3.5 開發的應用程序嘗試加載使用 .NET Framework 4 開發的程序集,便會引發此異常。 BadImageFormatException 異常可能會報告作為編譯時錯誤,或在運行時可能會引發該異常。 有關示例,請參見 BadImageFormatException 類。

       (3) 確保文件映像是有效的托管程序集或模塊。

       當非托管動態鏈接庫或可執行文件傳遞給 Load 方法進行加載時會引發此異常。

       根據調試能夠成功,而編譯發布卻失敗以及這些解釋可以推測一下這個原因很有可能是因為項目發布之后並不是32位的運行環境,於是根據此異常找到的解決方案是:

In IIS 7.5, in the Advanced Settings for the Application Pool associated with the Web Site hosting my Remote Object, I have simply changed the Enable 32-bits Application setting to true and the problem was gone.

這句話的含義是讓我們進入IIS管理器找到項目對應的IIS 應用池,然后將啟用32位應用程序改為true。具體操作是右擊對應的IIS應用池 -> 高級設置,修改為true。

如圖4-4所示。

 

2-4 啟用32位應用程序修改為true

2.3    依然有錯?

      經過上述修改后,重啟應用池和網站,具體需不需要重啟,進行操作的人可以自己嘗試一下,但是在寫這篇文檔的時候,是經過重啟操作的。這個時候發現網站可以正常打開的,還以為問題解決了呢,但是點擊按鈕或者其他事件的時候,如果是調用了SAP方法,程序依然會報出錯誤,而不能正常顯示我們需要的數據。

      如果是WEB Service,當調用相關方法的時候,出現的錯誤是:SAP.Middleware.Connector.RfcSessionManager”的類型初始值設定項引發異常。

如果是WEB項目程序,出現的錯誤如圖4-5所示。

 

2-5 初始化參數異常

        解決這兩個錯誤的方法是進入項目的應用程序池修改托管管道模式參數的值,將Integrated修改為Classic即可,詳見圖4-6所示。

 

 

2-6 托管管道模式修改為Classic

2.4    結束語

        經過上述的操作,解決了遇到的問題后,WEB或者WEB Service就能夠成功的連接到SAP系統,並從中獲取到我們需要的數據了,以上是我的一點經驗總結,OVER。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM