因為專案需要呼叫公司既有的 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 物件)
留言列表