天天看點

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 <code>optional</code> mode is the default settings. In this mode the WSE processes the incoming SOAP messages whether or not they are <code>MTOM</code> 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 <code>MTOM</code> or not, if the client application request to use <code>MTOM</code> the web service will use <code>MTOM</code>.

In <code>always</code> mode all incoming and outgoing SOAP messages must be <code>MTOM</code> encoded. When a SOAP request is received that is not encoded using <code>MTOM</code>, 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 <code>never</code> mode all incoming SOAP messages must not be <code>MTOM</code> encoded. When a SOAP request is received that is encoded using <code>MTOM</code>, an HTTP error 415: "Media unsupported" is returned to the sender. That means the client application should never use <code>MTOM</code>.

對應的配置檔案為:

    &lt;messaging&gt;

      &lt;mtom serverMode="optional" clientMode="On" /&gt;

    &lt;/messaging&gt;

     2.2用戶端的設定與服務端類似:

用戶端配置檔案的代碼如下:

      &lt;mtom clientMode="On" serverMode="optional" /&gt;

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進制資料

    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示例示範了:加密上傳、下載下傳檔案、

//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安全協定.

    public byte[] DownLoadFileWithSecurity(string fileName)

        byte[] file = null;

        file = File.ReadAllBytes(filePath);//從檔案裡讀取位元組流

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 has been downloaded with security sucessfully from Server: {0}", loadFile.Length);

            String filePath = AppDomain.CurrentDomain.BaseDirectory + "Secure_"+ fileName;

                File.WriteAllBytes(filePath, loadFile);

        //測試非加密安全上傳檔案

        public void UpLoadFile(String fileName)

            //執行個體化服務代理

            //讀取檔案資料

            byte[] upFile = File.ReadAllBytes(filePath);

            //調用方法傳輸資料

            serviceproxy.UpLoadFile(upFile);

            //輸出上傳檔案資訊

            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 消息會産生顯著的開銷。

   Web服務駐留在IIS外,可以由系統服務、控制台程式等托管的方式比較簡單,大家可以參考微軟的例子,這個WCF裡也有類似的寄宿宿主的概念。其實有許多相似之處。

   最後在準備《WSE3.0建構Web服務安全》系列文章的過程中,我也收獲不少,也希望本系列文能給您的學習帶來一些幫助。包括我之前的《WCF分布式開發必備知識》系列都是學習WCF分布式重要知識點的總結。并且全部給出了詳細的代碼實作和注釋。友善大家的學習和實際項目的應用。下面我們将正式進入WCF分布式開發的學習階段,我會繼續給出系統的介紹和詳細的實作代碼。希望有興趣的朋友繼續關注~謝謝

參考資料:

1.BASE64編碼基于十進制的實作方法

2.MTOM編碼 MSDN

 本文轉自 frankxulei 51CTO部落格,原文連結:http://blog.51cto.com/frankxulei/320503,如需轉載請自行聯系原作者

繼續閱讀