程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WSE3.0構建Web服務安全(4) MTOM消息傳輸優化和文件上傳、下載

WSE3.0構建Web服務安全(4) MTOM消息傳輸優化和文件上傳、下載

編輯:關於.NET

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機制進行數據傳遞.如果設置為Always,服務端會一直使用MTOM機制進行消息的傳遞。一般不推薦使用這個方式。OFF即一直不使用MTOM機制進行消息傳遞。64為最大附加二進制文件的個數。最後表示需要首先使用SOAP消息封裝。

對應的配置文件為:

<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.2 WSE3MTOMSecureService定義了一個文件下載的方法。具體如下:

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

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

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

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved