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
??? 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
總結
以上是生活随笔為你收集整理的WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载】2009年.NET技术大会讲义(
- 下一篇: css 优先级