2016-10-10 80 views
1

這不是Java特定的問題,但讓我們舉一個Java示例:在Java世界中將xmime:expectedContentTypes="*/*添加到base64元素以啓用服務器上的MTOM處理是標準做法這樣做會導致@XmlMimeType批註,使用DataHandler而不是字節數組等等。儘管這個描述當然被大大簡化了,但xmime:expectedContentTypes="*/*通常被開發人員認爲是'MTOM ready'(更重要的是也被實現的庫)當在模式中看到時。從我從例子中得到的結果來看,C#世界的情況是一樣的。如何標記SOAP服務「啓用MTOM」

但它對我來說確實沒有意義 - 該屬性指定了我們在XML中實際期望的數據類型,而不是它可以與MTOM一起使用。在任何RFC或類似的SOAP 1.1文檔中,我也沒有發現預期的內容類型和MTOM之間有任何直接聯繫。

我的問題可以從兩個方面來表述:

  1. 如何服務明確表示它接受/在請求/響應提供二進制數據作爲MTOM附件?
  2. 客戶端如何正確識別可以通過使用給定服務的MTOM附件發送/獲取二進制數據?

回答

5

看來你在附件,SOAP附件和MTOM之間有些混淆。

SOAP-Attachment在December 2000 as a W3C note(不是規範)中首次引入,並定義了對SOAP 1.1中定義的傳輸綁定機制的擴展。具體地講,本說明中所定義:

一個用於SOAP綁定1.1消息到MIME多部分/相關消息內以這樣的方式來進行,對於SOAP 1.1消息的處理規則是preserved.The MIME多機構用於封裝複合文檔可用於捆綁與SOAP 1.1消息相關的實體,如附件。

簡單來說,它定義爲使用多部分MIME結構運輸多個文檔(附件)將與SOAP消息在其原生格式相關聯的機制。這是通過使用combination of "Content-Location" and "Content-ID" headers以及set of rules來解釋由「Content-Location」頭引用的URI來實現的。

這種格式的SOAP消息,可以看作以下(封裝成多/ MIME):

enter image description here

這也是你可能已經與當你使用SAAJ工作的格式,但不再推薦,除非你使用遺留代碼。 W3C的說明後來在2004年修改爲「功能」級別(與SOAP 1.2一起),並且是SOAP MTOM機制的eventually superseded

SOAP消息傳輸優化機制(MTOM)正式定義爲不是一個,而是three separate features一起工作以提供功能:

  1. "Abstract SOAP Transmission Optimization Feature"描述一個抽象的特徵來優化傳輸和/或有線格式通過有選擇地對消息的部分進行編碼,同時仍然向SOAP應用呈現XML信息集。

  2. "An optimized MIME Multipart/Related serialization of SOAP Messages"描述了以獨立於綁定的方式實現SOAP抽象傳輸優化特徵的SOAP消息的優化的MIME多部分/相關序列化。

  3. "HTTP SOAP Transmission Optimization Feature"描述了SOAP 1.2 HTTP綁定的抽象傳輸優化特性的實現。

如果你讀了第二份文件,你會發現,「附件」已被替換爲XML binary optimized "packages"或XOP。

通過在可擴展的打包格式(例如MIME Multipart/Related,請參閱[RFC 2387])中放置XML Infoset的序列化來創建XOP包。然後,提取並重新編碼作爲base64編碼二進制數據的其內容的所選部分(即,從base64解碼數據)並將其放入包中。這些選定部分的位置在XML中用一個使用URI鏈接到打包數據的特殊元素進行標記。

簡而言之,這意味着不是將數據作爲「附件」封裝在multipart/mime消息中,而是現在通過「指針」或鏈接引用數據。下面的圖表可以幫助理解:

enter image description here

現在,我們有後臺,讓我們回到你的問題。

  1. 該服務如何明確表示它接受/提供二進制數據作爲請求/響應中的MTOM附件? 它沒有。沒有MTOM附件的概念,因此服務器不能聲明它接受附件。

  2. 客戶端如何正確識別可以通過使用給定服務的MTOM附件發送/獲取二進制數據? 就像我上面所說的那樣,客戶端沒有辦法做到這一點,因爲不支持「附件」。

話雖如此,但仍然是各國就XML media types另一個W3C規範:

xmime:contentType屬性信息項允許Web服務應用程序優化的二進制元素定義的二進制數據的處理信息項目,應該被視爲元數據。 xmime:contentType屬性的存在不會更改元素內容的值。

當您使用xmime:contentTypexmime:expectedContentTypes="application/octet-stream* should not be used)啓用MTOM,生成WSDL將有一個這樣的條目:

<element name="myImage" xmime:contentType="xsd:base64Binary" xmime:expectedContentTypes="application/octet-stream"/> 這是宣佈,它可以接收XML二進制優化封裝的服務器的方式(這可以分解爲多部分MIME消息)。

當客戶端看到上述情況,客戶端知道服務器可以接受XML二進制優化的封裝,併產生適當的HTTP請求所限定Identifying XOP Documents

XOP文檔,在MIME類系統中使用時,與被識別「application/xop + xml」媒體類型,帶有所需的「type」參數,用於傳遞原始XML序列化的關聯內容類型。

希望有所幫助!

相關問題