最近筆者負責ERP財務系統跟中糧集團財務公司的財務系統作對接,鑑於ERP系統中應付結算單結算量比較大,並且管理相對集中,ERP系統與中糧財務公司的支付平臺系統對接,實現銀企直聯,將網銀錄入的環節、付款之後ERP確認環節自動化,節省人工操做環節帶來的偏差。
這樣公司財務人員在咱們的系統中作對外的付款單,自動向集團財務系統發起付款指令,由集團統一經過銀行給對應的供應商轉帳,並監控付款單的狀態,完成供應商在系統的正常結算。瀏覽器
業務層面再也不多述,本文主要介紹技術層面實施:網絡
自VS2008之後,爲了對.NET Framework 3.0 或 3.5版本上WCF Service Library的支持。增長了Add Service Reference(添加服務引用)功能,這樣能夠在VS中很方便的添加Web Service接口引用,並經過簡單的配置,調用遠程服務。架構
通常來講不能夠隨便訪問集團SAP,必須找運維人員開通訪問權限。開通後,經過telnet查看ip地址和端口是否已經開放,或者瀏覽器訪問,正常的話應該以下圖:
app
選中項目,右鍵 -> Add -> Service Reference
彈出的界面中,Address輸入提供的Web Service地址,而後點擊 GO 按鈕,這裏通常會提示輸入用戶名和密碼,輸入後能夠看到Web Service引用連通。展開服務,能夠看到接口提供了2個方法。若是這一步提示錯誤,能夠在瀏覽器中輸入地址,看看是否能訪問,其實就是訪問遠程的wsdl文件,若是訪問不了,再檢查是不是網絡或者權限的緣由。
咱們點「肯定」,能夠看到VS自動幫咱們在項目目錄下生成了一個文件夾:Service References,裏面有剛纔看到的服務名,同時會在 app.config 中增長一段配置相似以下(若是當前沒有app.config文件,會自動生成):運維
<system.serviceModel> <client> <endpoint address="http://xx.xx.xxx.xx:50000/xxxxxxx" binding="basicHttpBinding" bindingConfiguration="SOS_TxService_SendBinding" contract="TxService.SOS_TxService_Send" name="HTTP_Port" /> </client> </system.serviceModel>
爲了更好的學習,咱們深刻了解一下,VS幫咱們都作了哪些工做。
項目新建的Service References目錄下的服務,在VS中是沒法查看的,咱們能夠進入對應的目錄下,看看都生成了哪些文件:
首先能夠看到,目錄下有個wsdl文件,你們應該都熟悉,這是用來定義和描述Web Service的,經過這個文件,就能夠知道接口都提供了哪些方法,輸入參數類型和輸出結果格式。打開這個wsdl文件看一下,跟咱們想象的同樣,原來,VS在引用服務訪問遠程wsdl文件的同時,在本地拷貝了一份。
接下來咱們看一個後綴爲 .cs 重要的文件,打開看下,這裏面,VS幫咱們生成了關於這個服務的接口和實現類。
這裏最重要的,是幫咱們生成了 SOS_TxService_SendClient 這個類,研究一下,發現已經實現了以前看到的Send、Send1兩個方法,並提供了對應的異步方法。
咱們整理一下VS作的工做:異步
到這裏,聰明的你可能要問,既然VS已經幫咱們生成了代理服務類 SendClient,並且類已經提供了接口方法的具體實現,如今是否是直接實例化一個服務類,直接調用方法就能夠遠程調用?是的,沒錯!VS基本把須要作的工做都幫你作了,剩下的就是使用就好了,簡單吧。工具
通常狀況下,咱們訪問Web Service,須要提供用戶名和密碼的權限認證,不然直接調用的話,會報錯。
這裏咱們修改一下 app.config 文件以下:單元測試
<system.serviceModel> <bindings> <basicHttpBinding> <binding name="SOS_TxService_SendBinding" > <security mode="TransportCredentialOnly" > <transport clientCredentialType="Basic"/> <message clientCredentialType="UserName"/> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://xx.xx.xxx.xx:50000/xxxxxxx" binding="basicHttpBinding" bindingConfiguration="SOS_TxService_SendBinding" contract="TxService.SOS_TxService_Send" name="HTTP_Port" /> </client> </system.serviceModel>
單元測試調用一下,能夠看到能正常返回 xml 格式的結果:學習
[TestMethod] public void WebServiceTest() { var client = new SOS_TxService_SendClient(); if (client.ClientCredentials != null) { client.ClientCredentials.UserName.UserName = "username"; client.ClientCredentials.UserName.Password = "password"; try { var tt = client.Send("test"); Assert.IsTrue(tt.Length > 0); } catch (Exception e) { Console.WriteLine(e); throw; } } }
還有一個問題,就是跨項目引用,好比在一個基礎服務項目中,實現了遠程調用。在應用層項目中,引用了基礎服務項目dll,應該注意如下一點:選中生成的服務,右鍵-> Configure Service Reference:
保證相關的程序集可以正常引用,而後在應用層項目,並手動將 app.config 的相關配置拷貝至項目目錄下。測試
至此,咱們經過VS調用 Web Service 實施成功,仍是比較簡單,其實沒有什麼技術難點,主要但願能深刻了解原理,知道VS後臺自動幫助咱們作了哪些工做,若是咱們不使用輔助工具的時候,要實現遠程訪問,應該怎麼去實現。 注:目前 .net core 環境對 Web Service 支持不是很好,筆者在VS2017中,.net core 引用 Web Service依舊報錯,你們有興趣能夠本身研究一下。