close

因為專案需要呼叫公司既有的 Web Service 來處理上/下傳檔案,所以先前花了些時間在測試 Web Service 與 Client 端有關於傳檔的寫法,當時是使用 AXIS 的技術。

雖然測試的結果都很 ok,但實際上拿到公司的 Web Service 時,才發現公司是用 AXIS2,一開始也不以為意,依舊用 AXIS 的 Client 是呼叫這個 Web Service,不過結果確很讓人沮喪,因為雖然一般的呼叫都沒問題,但只要呼叫上傳檔案的方法就會丟出錯誤:

org.apache.axis2.AxisFault: Invalid reference :cid: xxxxxxxxxxxxxxxxx』(其中的 XXXX 是一串文數字,每次都不相同)

雖然打開 Debug 看傳出去的 XML 格式,發現這個 cid 的確在後面有跟著檔案的內容 (格式類似 email 的附件),但是 Web Service 就是不認得,不過如果改用 AXIS2 的 Client 就能很正確的傳送檔案了。

這個問題困擾我一天多了,用咕狗大神雖然咕出不少資料,但是就是找不到這個發生在 AXIS Client 呼叫 AXIS2 Web Service 傳檔時問題的解答,因此只能自已想辦法了,當然改用 AXIS2 的 Client 就能解決,但是笨鳥的脾氣拗,又實在不是很習慣 AXIS2 的 Client 寫法,所以還是滿執意要找出答案。

從丟出錯誤的類別與訊息中,大概可以判斷出應該是傳遞檔案時的 XML 格式與 AXIS2 認知的不同,才會導致 AXIS2 Web Service 在解析傳來的 XML 時發生找不到相對應的附檔的錯誤。不過知道是一回事,但因為看不到 AXIS2 Client 在傳檔案時產生出來的 XML 格式長怎樣,所以根本無法和 AXIS 來做比較,不過多少也算是個線索。

後來乾脆回頭看 AXIS 的 API,發現 org.apache.axis.client.Call 這個類別可以額外的再設些參數,其中的『ATTACHMENT_ENCAPSULATION_FORMAT』參數從字意上看來感覺好像可以解決我的問題,於是試了一下,果然一下就解決這個問題了。

 

解決的方法很解單,只要在 new 出 Call 之後再多加下面這行設定即可:

call.setProperty(Call.ATTACHMENT_ENCAPSULATION_FORMAT,
                            Call.
ATTACHMENT_ENCAPSULATION_FORMAT_MTOM);

(其中的 call 是 Call 類別的 instance 物件)

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大笨鳥 的頭像
    大笨鳥

    大笨鳥的私房菜

    大笨鳥 發表在 痞客邦 留言(0) 人氣()