1. 問題背景
現在我們兩套語言并行,其中必然會涉及到不同系統的相互訪問, .net 的會員資訊是用 webservice 提供服務的,那如何對現有 .net webservice 不做任何改動的情況下,用 Java 的 cxf 來訪問呢,公司的知識庫里面也有這個技術專題,但是我們公司招投標的 .net webservice 涉及到一些比較特別的加密方式 和 特有的資料回傳結構,比如加密資訊是放在 SoapHeader 里面,回傳的資料格式為 DataSet ,特別是 DataSet 這個是 .net 特有的,這個時候通用的方法就顯得不能為力了,我們需要做點小小的改動,
2. cxf 攔截器
要處理這個問題,我們要需要回歸到最初的 soap (Simple Object Access Protocol),可以理解為一份有規定格式的xml 檔案,我們需要自己來處理發送和回傳的 xml 檔案,為了做這件事情,我們先來了解一下 cxf 的攔截器
![]()
上圖顯示了一個請求流程中的各個攔截點,我們使用其中的 WRITE、PRE_STREAM、RECEIVE
![]()
1) WRITE 攔截器 我們增加SoapHeader認證資訊

2)PRE_STREAM 攔截器 ,獲取發送報文,這個攔截器可以不加,我加只是為了獲取發送的報文,方便我們最后對比發送報文和回傳的報文,
3)Receive 攔截器,獲取回傳的報文,這個攔截器非常重要,這里面有我們需要的全部資訊,
3. 決議SOAP 報文
這個時候我們已經完成了80% 的作業,現在我們來看一下獲取的報文,重點關注一下檔案的結構,
1) 發送的報文,已經添加了認證需要的SoapHeader資訊,
![]()
2) 回傳的報文,已經有我們需要的資訊,然后當作一份 xml 檔案來處理就可以了,
4. 小結
在這個問題處理當中,我們需要注意的一點就是,不同語言對這份規定格式的 xml 檔案有不同的決議,會對我們的處理造成一定的困擾,這個時候我們要不忘初心,回到最原始的起點,二進制流 、字串、xml 檔案,方得始終,需要的資訊就隱藏在里面,
5. 小疑問
為什么我們用的是 Write、PreStream、Receive 這三個攔截器,其他的行不行,要說明這個問題,我們就要了解每個攔截器的作用以及在流程中所處的位置,可以看一下這篇文章 https://www.cnblogs.com/luangeng/p/6602667.html,可能看完了還是有點云里霧里,那也沒有關系,你可以每個攔截都去試一下,看一下獲取的是什么,輸出的什么,這個程序當中,可能還需要其他一些協議來幫助你理解,也許會有一些意想不到的新發現,那就邊學邊試吧,
6. 展望一下
經過這么一番折騰,也算解決了一些問題,那么有沒有一種協議、標準、設計風格可以優雅的在不同的系統中暢行呢,或許RESTful 可以試一下, REST(Representational State Transfer )這個詞是Roy Thomas Fielding在他2000年的博士論文中提出的(文末有論文中文版附件),最后參考一下 Roy Thomas Fielding 博士介紹論文寫作目的來結尾,原文如下: "本文研究計算機科學兩大前沿,軟體和網路的交叉點,長期以來,軟體研究主要關注軟體設計的分類、設計方法的演化,很少客觀地評估不同的設計選擇對系統行為的影響,而相反地,網路研究主要關注系統之間通信行為的細節、如何改進特定通信機制的表現,常常忽視了一個事實,那就是改變應用程式的互動風格比改變互動協議,對整體表現有更大的影響,我這篇文章的寫作目的,就是想在符合架構原理的前提下,理解和評估以網路為基礎的應用軟體的架構設計,得到一個功能強、性能好、適宜通信的架構,"
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/112632.html
標籤:C#
上一篇:有任意點 用最少給定大小的矩形 將其囊括在內。求演算法。
下一篇:C# 呼叫TRIO控制器ActiveX教程