1. 程式人生 > 實用技巧 >WSE3.0構建Web服務安全(4):MTOM訊息傳輸優化和檔案上傳、下載

WSE3.0構建Web服務安全(4):MTOM訊息傳輸優化和檔案上傳、下載

MTOM訊息優化傳輸機制主要應用於大量資料的傳輸,很多文章中也直接得出結論:使用MTOM檔案傳輸效率高。為什麼MTOM的資料傳輸效率會比別的方式要高?MTOM真的如此完美嗎,它有什麼不足?什麼情況下使用MTOM?這些疑問,本文WSE3.0構建Web服務安全系列文章的第4節:MTOM訊息優化傳輸機制和檔案上傳、下載--將為您一一解答。本節結構為1.MTOM基礎概念2.WSE3.0工具配置MTOM3.程式碼實現與分析4.總結。最後附上實現程式碼供大家參考。 WSE3.0中引入MTOM機制,給我們藉助WSE框架實現大量資料的互動帶來顯著的益處。在WSE 3.0中,我們可以使用MTOM用於伺服器端和客戶端傳遞訊息,另外的好處就是,WSE 3.0M允我們在傳遞大資料量時使用WSE 3.0訊息層的安全性機制,藉助WSE3.0的安全框架,我們不僅可以驗證使用者的合法性,還可以對訊息進行加密,不僅能夠保證資料的安全,還可以實現大資料量的高效傳輸。
1.【MTOM基礎概念】 提到MTOM訊息優化傳輸機制,通常的實驗結果是使用MTOM傳輸資料會提高大約33%的效能。 訊息傳輸優化機制 (MTOM) 標準允許將訊息中包含的大型資料元素外部化,並將其作為無任何特殊編碼的二進位制資料隨訊息一起傳送。MTOM 訊息會打包為多部分/相關 MIME 序列,放在SOAP 訊息中一起傳送。 我們需要了解一些相關的概念。什麼是BASE64編碼、MTOM訊息優化傳輸機制、MIME。這些對於我們理解MTOM訊息優化傳輸機制問題非常的必要。下面就來做下介紹。 1.1【BASE64編碼】 BASE64編碼 的原理很簡單,其方法是,將輸入資料流每次取6 bit(每bit代表1位二進位制),不足6bit的補0,這樣,每3個8位位元組將編碼為4個6位位元組(3×8 → 4×6);不滿4個位元組的以“=”填充。其實這4個六位位元組 仍然是8位,只不過高兩位被設定為0。當一個位元組只有6位有效時,它的取值空間為0 到 2的6次方減1 即63,也就是說被轉換的Base64編碼的每一個編碼的取值空間為(0~63)。   這樣就可以將3個8位位元組,轉換為4個位元組,這4個轉換的位元組都可以對映到字元中。也即資料都可以使用字元編碼代替。 因為轉換後的字串要比原來的多一個位元組,長1/3。因此編碼後的資料長度增加到4/3倍。這裡也是為什麼使用SOAP訊息效率比MTOM低的原因。因為SOAP使用XML語言進行訊息傳遞,XML是基於BASE64編碼的語言。 1.2【MIME】 MIME表示多用途Internet郵件擴允協議。MIME擴允了基本的面向文字的Internet郵件系統,以便可以在訊息中包含二進位制附件。MIME(Multipurpose Internet Mail Extentions),一般譯作"多用途的網路郵件擴充協議"。顧名思義,它可以傳送多媒體檔案。 MIME (Multipurpose Internet Mail Extensions,多目的Internet郵件擴充套件)是建立用於電子郵件交換,網路文件,及企業網和Internet上的其他應用程式中的檔案格式的規範。
1.3【MTOM訊息優化傳輸】 MTOM 全稱Message Transmission Optimization Mechanism,即訊息傳輸優化機制。它提出的模型適用於大量資料的互動情況。針對Base64編碼情況帶來的開銷提出的解決方案。當資料量小的時候,SOAP依然使用XML進行訊息的傳遞。 但是在大量資料情況下,如果資料依然進行Base64編碼,會帶來33%的額外開銷,這樣的情況對於大量資料交換的情況是無法容忍的。MTOM 就是針對SOAP 訊息傳輸的基礎上提出的改進辦法。對於大量資料的傳遞,不會進行進行Base64編碼,而是直接以附件的二進位制原始資料的形式封裝在SOAP訊息的MIME 部分,進行傳輸。SOAP 訊息通過指向隨其傳送的 MIME 部分來引用二進位制內容,另外包括SOAP基本的XML 資料,這些還是Base64編碼。因為此模型與簡單郵件協議SMTP 模型基本一致。 MTOM通過簡化大量資料的編碼過程,從而提高資料的處理效率。因為SOAP訊息等必要的資訊,MTOM 也有一些必要的開銷。MTOM僅在二進位制資料元素的大小超過大約 1 KB 時,才能體現出其優勢。 2.【WSE3.0工具配置MTOM】 在WSE3.0專案中使用MTOM訊息傳輸優化機制非常的方便,我們可以使用WSE 3.0配置工具分別為Web 服務和Client客戶端設定啟用MTOM,生成相應的策略檔案,WSE3.0機制會根據策略對訊息傳輸使用MTOM(也可以通過程式碼實現) 。 資料使用位元組流byte[]陣列在客戶端和服務端進行傳輸,簡單的例子就是訊息的互動和檔案的上傳和下載操作。本次配置基本介紹的情況也是藉助WSE3.0的安全機制實現檔案的安全傳輸。 2.1首先使用WSE 3.0配置工具設定服務端訊息傳輸策略。如圖:
客戶端設定為on,要求客戶端使用MTOM機制進行資料傳輸。服務端設定為Optional,表示可選,服務端既支援MTOM又可以不支援MTOM編碼的訊息。適用性強。 此種情況即服務端會根據客戶端的請求型別來決定是否啟用MTOM機制進行資料傳遞.如果客戶端適用MTOM編碼,則服務會啟用MTOM處理訊息。如果設定為Always,服務端會一直使用MTOM機制進行訊息的傳遞。一般不推薦使用這個方式。OFF即一直不使用MTOM機制進行訊息傳遞。64為最大附加二進位制檔案的個數。最後表示需要首先使用SOAP訊息封裝。 The optional mode is the default settings. In this mode the WSE processes the incoming SOAP messages whether or not they are MTOM
encoded. This gives much more flexibility to web services that are not only dealing with large amount of data. With optional the client is the one who decide whether to use MTOM or not, if the client application request to use MTOM the web service will use MTOM. In always mode all incoming and outgoing SOAP messages must be MTOM encoded. When a SOAP request is received that is not encoded using MTOM, an HTTP error 415: "Media unsupported" is returned to the sender. This option is ideal for Web Services that only deal with large amount of data. In never mode all incoming SOAP messages must not be MTOM encoded. When a SOAP request is received that is encoded using MTOM, an HTTP error 415: "Media unsupported" is returned to the sender. That means the client application should never use MTOM. 對應的配置檔案為: <messaging>
<mtom serverMode="optional" clientMode="On" />
</messaging>
2.2客戶端的設定與服務端類似: 客戶端配置檔案的程式碼如下: <messaging>
<mtom clientMode="On" serverMode="optional" />
</messaging>
3.【程式碼實現與分析】 進行完畢配置以後我們來具體進入程式碼的開發階段。這裡給出了使用MTOM上傳照片的例子,一個使用了證書加密圖片上傳。先給出服務端的實現,包括兩個服務類:WSE3MTOMService和WSE3MTOMSecureService。方法都是二進位制位元組資料流的傳遞。 3.1WSE3MTOMService直接實現基於MTOM機制的圖片上傳和下載方法,具體實現如下: //WSE 3.0 Samples中的MTOM示例演示了:不加密上傳、下載檔案、
[WebService(Namespace = "http://www.cnblogs.com/frank_xl/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WSE3MTOMService : System.Web.Services.WebService
{
public WSE3MTOMService()
{
}
//此方法返回不加密的位元組陣列,下載檔案
[WebMethod]
public byte[] DownLoadFile(string fileName)
{
byte[] file = new byte[1024];
String filePath = AppDomain.CurrentDomain.BaseDirectory + @"App_Data\" + fileName;
file = File.ReadAllBytes(filePath);
return file;
}
//上傳檔案,傳回2進位制資料
[WebMethod]
public void UpLoadFile(byte[] file)
{
String filePath = AppDomain.CurrentDomain.BaseDirectory + @"App_Data\" + "FrankXuLei.gif";
if (File.Exists(filePath))
File.Delete(filePath);
File.WriteAllBytes(filePath, file);
}
}
3.2WSE3MTOMSecureService定義了一個檔案下載的方法。具體如下: //WSE 3.0 Samples中的MTOM示例演示了:加密上傳、下載檔案、
[WebService(Namespace = "http://www.cnblogs.com/frank_xl/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
//Returns binary data secured via the ServerPolicy in the wse3policyCache.config policy file
[Policy("ServerPolicy")]
public class WSE3MTOMSecureService : System.Web.Services.WebService
{
public WSE3MTOMSecureService()
{
}
//T通過服務端 X509 證書加密
// MTOM可以使用WS-Security安全協議.
[WebMethod]
public byte[] DownLoadFileWithSecurity(string fileName)
{
byte[] file = null;
String filePath = AppDomain.CurrentDomain.BaseDirectory + @"App_Data\" + fileName;
file = File.ReadAllBytes(filePath);//從檔案裡讀取位元組流
return file;
}
}
3.3客戶端建立控制檯應用程式,新增對Web服務的引用。例項化連個代理服務類,進行檔案的上傳和下載。具體程式碼如下: //直接進行資料傳輸,不需要加密
public void DownLoadFile(String fileName)
{
//例項化服務代理類
WSE3MTOMServiceWse serviceproxy = new WSE3MTOMServiceWse();
//or alternatively set the RequireMtom property on the proxy
//serviceproxy.RequireMtom = true;
//獲取檔案二進位制位元組流
byte[] loadFile = serviceproxy.DownLoadFile(fileName);
//列印資料資訊
Console.WriteLine("File Name: {0}", fileName);
Console.WriteLine("File has been downloaded without security sucessfully from Server: {0}", loadFile.Length);
//儲存檔案
String filePath = AppDomain.CurrentDomain.BaseDirectory + fileName;
Console.WriteLine("");
if (File.Exists(filePath))
File.Delete(filePath);
File.WriteAllBytes(filePath, loadFile);
}
//安全方式下載檔案
public void DownLoadFileSecure(String fileName)
{

WSE3MTOMSecureServiceWse serviceproxy = new WSE3MTOMSecureServiceWse();
//Set anonymousForCertificateSecurity policy assertion when calling
//this secure service
serviceproxy.SetPolicy("ClientPolicy");
byte[] loadFile = serviceproxy.DownLoadFileWithSecurity(fileName);
//列印資料資訊
Console.WriteLine("File Name: {0}", fileName);
Console.WriteLine("File has been downloaded with security sucessfully from Server: {0}", loadFile.Length);
//儲存檔案
String filePath = AppDomain.CurrentDomain.BaseDirectory + "Secure_"+ fileName;
Console.WriteLine("");
if (File.Exists(filePath))
File.Delete(filePath);
File.WriteAllBytes(filePath, loadFile);
}
//測試非加密安全上傳檔案
public void UpLoadFile(String fileName)
{
String filePath = AppDomain.CurrentDomain.BaseDirectory + fileName;
//例項化服務代理
WSE3MTOMServiceWse serviceproxy = new WSE3MTOMServiceWse();
//讀取檔案資料
byte[] upFile = File.ReadAllBytes(filePath);
//呼叫方法傳輸資料
serviceproxy.UpLoadFile(upFile);
//輸出上傳檔案資訊
Console.WriteLine("File Name: {0}", fileName);
Console.WriteLine("File has been uploaded sucessfully from Client: {0}", upFile.Length);
}
執行結果如圖: 首先是上傳一個檔案到伺服器端,然後進行下載操作。均顯示成功。可以在程式的執行目錄下找到下載的新檔案。 4.【總結】 通過以上的介紹和學習,我們知道了一下結論: 1.MTOM機制會效率提升1/3.原因:正常文字 XML 使用 Base64 對二進位制資料進行編碼,這要求每三個位元組對應四個字元,從而使得資料的大小增加三分之一。MTOM 能夠以原始位元組形式傳輸二進位制資料,這會縮短編碼/解碼時間並生成較小的訊息。 2.使用的場合:MTOM適合大量的資料交換,通常是大量資料情況下才有優勢, 如上傳文件和圖片,目的在於優化對較大的二進位制負載的傳輸。 3.缺陷:對於較小的二進位制負載來說,使用 MTOM 傳送 SOAP 訊息會產生顯著的開銷。 另外提供本文的程式碼下載。以供大家學習參考,程式碼下載連線/Files/frank_xl/WSE3MTOM_FrankXuLei.rar。如有意見也歡迎交流~ Web服務駐留在IIS外,可以由系統服務、控制檯程式等託管的方式比較簡單,大家可以參考微軟的例子,這個WCF裡也有類似的寄宿宿主的概念。其實有許多相似之處。 最後在準備《WSE3.0構建Web服務安全》系列文章的過程中,我也收穫不少,也希望本系列文能給您的學習帶來一些幫助。包括我之前的《WCF分散式開發必備知識》系列都是學習WCF分散式重要知識點的總結。並且全部給出了詳細的程式碼實現和註釋。方便大家的學習和實際專案的應用。下面我們將正式進入WCF分散式開發的學習階段,我會繼續給出系統的介紹和詳細的實現程式碼。希望有興趣的朋友繼續關注~謝謝 1.WSE3.0安全機制與例項開發 2.非對稱加密、公鑰、金鑰、證書、簽名的區別和聯絡以及X.509 證書的獲得和管理 3.WSE3.0策略配置、證書、簽名、與例項開發 參考資料: 1.BASE64編碼基於十進位制的實現方法 2.MTOM編碼 MSDN