MTOM (Message Transmission Optimization Mechanism) 專為大數據傳輸設計,實測效率提升 ~33%。本文解析原理、WSE 3.0 配置、代碼實現與適用場景。
3 位元組 → 4 字符(+33% 體積)。SOAP 預設用 Base64 編碼二進制數據,大文件傳輸效率極低。
MTOM 將大型二進制元素外部化,以原始二進制形式置於 MIME 多部分訊息中,SOAP 僅保留引用(xop:Include),XML 部分仍用 Base64。
僅當二進制元素 > ~1KB 時體現優勢;小數據反因 MIME 封裝開銷變慢。
clientMode="On":要求客戶端使用 MTOMserverMode="Optional":服務端視數據大小決定是否啟用(推薦)maxMessageSize="64":最大附件數生成配置:
<messaging>
<mtom serverMode="optional" clientMode="On" />
</messaging>
<messaging>
<mtom clientMode="On" serverMode="optional" />
</messaging>
[WebService(Namespace = "https://www.cnblogs.com/frank_xl/")]
public class WSE3MTOMService : WebService {
[WebMethod]
public byte[] DownLoadFile(string fileName) {
string path = AppDomain.CurrentDomain.BaseDirectory + @"App_Data\" + fileName;
return File.ReadAllBytes(path);
}
[WebMethod]
public void UpLoadFile(byte[] file) {
string path = AppDomain.CurrentDomain.BaseDirectory + @"App_Data\FrankXuLei.gif";
if (File.Exists(path)) File.Delete(path);
File.WriteAllBytes(path, file);
}
}
[Policy("ServerPolicy")]
public class WSE3MTOMSecureService : WebService {
[WebMethod]
public byte[] DownLoadFileWithSecurity(string fileName) {
string path = AppDomain.CurrentDomain.BaseDirectory + @"App_Data\" + fileName;
return File.ReadAllBytes(path);
}
}
[Policy("ServerPolicy")] 引用 wse3policyCache.config 中的安全策略(X509 證書加密)。
// 非安全下載
public void DownLoadFile(string fileName) {
var proxy = new WSE3MTOMServiceWse();
byte[] data = proxy.DownLoadFile(fileName);
File.WriteAllBytes(fileName, data);
}
// 安全下載
public void DownLoadFileSecure(string fileName) {
var proxy = new WSE3MTOMSecureServiceWse();
proxy.SetPolicy("ClientPolicy"); // 對應客戶端策略
byte[] data = proxy.DownLoadFileWithSecurity(fileName);
File.WriteAllBytes("Secure_" + fileName, data);
}
// 上傳
public void UpLoadFile(string fileName) {
var proxy = new WSE3MTOMServiceWse();
byte[] data = File.ReadAllBytes(fileName);
proxy.UpLoadFile(data);
}
| 項目 | 結論 |
|---|---|
| 效率提升 | ~33%(避免 Base64 編碼/解碼,減小訊息體積) |
| 適用場景 | 大文件(文檔、圖片)、大量二進制負載 |
| 缺陷 | 小二進制負載顯著增加開銷 |
| 安全整合 | 可結合 WS-Security 簽名加密 |
本系列下一階段進入 WCF 分布式開發學習,敬請關注。本文附完整源碼。