2013-03-05 34 views

回答

10

爲了調用Web服務,您需要尊重它的合同。如果一個web服務有<operationA><operationB>,但你發送<operationC>給它,你會得到一個錯誤(SOAP說法中的一個錯誤)。

該Web服務具有操作<operationA><operationB>,並且知道在消息包含<operationA><operationB>時如何處理該消息。但它沒有<operationC>,並且不知道如何處理包含<operationC>的消息,因此它只是返回一個錯誤。一個不正確的主體不能被忽略,但另一方面,標題對它們的內容沒有限制,所以你需要一個不同的機制來正確處理它們。

標題用於通過添加事務支持,身份驗證,路由等來擴展消息。但是這些擴展沒有在SOAP規範中定義,它們是用戶定義的。該規範只是說標題用於該標題,還指定在標題存在時必須如何處理消息。 mustUnderstand屬性是「應如何處理消息」的一部分。

SOAP消息從始發者傳播到最終目的地,可能通過沿消息路徑傳遞一組SOAP中介。頭可以針對特定節點或最終節點(即SOAP 1.1 actor屬性或SOAP 1.2 role屬性),並且當發生這種情況時,節點必須對頭進行一些操作。這可以是使用它或忽略它。

mustUnderstand屬性指示標頭的處理是可選的還是強制性的。這基本上轉化爲節點試圖找到與頭相匹配的適當處理程序,並繼續按照與其規範一致的方式處理消息。如果它找不到合適的處理程序,它必須返回一個錯誤並停止進一步處理。如果mustUnderstand爲真/ 1,則不允許該節點忽略它。

例如,想象頭是用於事務語義的(即調用必須在事務中執行,以便操作以原子方式執行,或者全部成功或全部失敗)。如果處理節點看到事務頭,它應該開始該事務。想象一下,如果節點看到標題,但不知道它是什麼,那麼它會決定忽略它,並且沒有事務開始。 稍後,某些操作失敗,而其他操作失敗並且沒有事務回滾。所以現在你的應用程序處於不一致的狀態。

SOAP mustUnderstand屬性允許可靠的進化。使用SOAP mustUnderstand屬性標記值爲「1」的元素必須假設以某種方式修改其父對等元素的語義。以這種方式標記元素可以確保這種語義變化不會被那些不完全理解的人忽略(並且可能錯誤地)忽略。