WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载
生活随笔
收集整理的這篇文章主要介紹了
WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
MTOM消息優(yōu)化傳輸機(jī)制主要應(yīng)用于大量數(shù)據(jù)的傳輸,很多文章中也直接得出結(jié)論:使用MTOM文件傳輸效率高。為什么MTOM的數(shù)據(jù)傳輸效率會(huì)比別的方式要高?MTOM真的如此完美嗎,它有什么不足?什么情況下使用MTOM?這些疑問(wèn),本文WSE3.0構(gòu)建Web服務(wù)安全系列文章的第4節(jié):MTOM消息優(yōu)化傳輸機(jī)制和文件上傳、下載--將為您一一解答。本節(jié)結(jié)構(gòu)為1.MTOM基礎(chǔ)概念2.WSE3.0工具配置MTOM3.代碼實(shí)現(xiàn)與分析4.總結(jié)。最后附上實(shí)現(xiàn)代碼供大家參考。 WSE3.0中引入MTOM機(jī)制,給我們借助WSE框架實(shí)現(xiàn)大量數(shù)據(jù)的交互帶來(lái)顯著的益處。在WSE 3.0中,我們可以使用MTOM用于服務(wù)器端和客戶(hù)端傳遞消息,另外的好處就是,WSE 3.0M允我們?cè)趥鬟f大數(shù)據(jù)量時(shí)使用WSE 3.0消息層的安全性機(jī)制,借助WSE3.0的安全框架,我們不僅可以驗(yàn)證用戶(hù)的合法性,還可以對(duì)消息進(jìn)行加密,不僅能夠保證數(shù)據(jù)的安全,還可以實(shí)現(xiàn)大數(shù)據(jù)量的高效傳輸。
??? 1.【MTOM基礎(chǔ)概念】 提到MTOM消息優(yōu)化傳輸機(jī)制,通常的實(shí)驗(yàn)結(jié)果是使用MTOM傳輸數(shù)據(jù)會(huì)提高大約33%的性能。 消息傳輸優(yōu)化機(jī)制 (MTOM) 標(biāo)準(zhǔn)允許將消息中包含的大型數(shù)據(jù)元素外部化,并將其作為無(wú)任何特殊編碼的二進(jìn)制數(shù)據(jù)隨消息一起傳送。MTOM 消息會(huì)打包為多部分/相關(guān) MIME 序列,放在SOAP 消息中一起傳送。 我們需要了解一些相關(guān)的概念。什么是BASE64編碼、MTOM消息優(yōu)化傳輸機(jī)制、MIME。這些對(duì)于我們理解MTOM消息優(yōu)化傳輸機(jī)制問(wèn)題非常的必要。下面就來(lái)做下介紹。 1.1【BASE64編碼】 BASE64編碼 的原理很簡(jiǎn)單,其方法是,將輸入數(shù)據(jù)流每次取6 bit(每bit代表1位二進(jìn)制),不足6bit的補(bǔ)0,這樣,每3個(gè)8位字節(jié)將編碼為4個(gè)6位字節(jié)(3×8 → 4×6);不滿4個(gè)字節(jié)的以“=”填充。其實(shí)這4個(gè)六位字節(jié) 仍然是8位,只不過(guò)高兩位被設(shè)置為0。當(dāng)一個(gè)字節(jié)只有6位有效時(shí),它的取值空間為0 到 2的6次方減1 即63,也就是說(shuō)被轉(zhuǎn)換的Base64編碼的每一個(gè)編碼的取值空間為(0~63)。 這樣就可以將3個(gè)8位字節(jié),轉(zhuǎn)換為4個(gè)字節(jié),這4個(gè)轉(zhuǎn)換的字節(jié)都可以映射到字符中。也即數(shù)據(jù)都可以使用字符編碼代替。 因?yàn)檗D(zhuǎn)換后的字符串要比原來(lái)的多一個(gè)字節(jié),長(zhǎng)1/3。因此編碼后的數(shù)據(jù)長(zhǎng)度增加到4/3倍。這里也是為什么使用SOAP消息效率比MTOM低的原因。因?yàn)镾OAP使用XML語(yǔ)言進(jìn)行消息傳遞,XML是基于BASE64編碼的語(yǔ)言。 1.2【MIME】 ?????MIME表示多用途Internet郵件擴(kuò)允協(xié)議。MIME擴(kuò)允了基本的面向文本的Internet郵件系統(tǒng),以便可以在消息中包含二進(jìn)制附件。MIME(Multipurpose Internet Mail Extentions),一般譯作"多用途的網(wǎng)絡(luò)郵件擴(kuò)充協(xié)議"。顧名思義,它可以傳送多媒體文件。 MIME (Multipurpose Internet Mail Extensions,多目的Internet郵件擴(kuò)展)是創(chuàng)建用于電子郵件交換,網(wǎng)絡(luò)文檔,及企業(yè)網(wǎng)和Internet上的其他應(yīng)用程序中的文件格式的規(guī)范。 1.3【MTOM消息優(yōu)化傳輸】 MTOM 全稱(chēng)Message Transmission Optimization Mechanism,即消息傳輸優(yōu)化機(jī)制。它提出的模型適用于大量數(shù)據(jù)的交互情況。針對(duì)Base64編碼情況帶來(lái)的開(kāi)銷(xiāo)提出的解決方案。當(dāng)數(shù)據(jù)量小的時(shí)候,SOAP依然使用XML進(jìn)行消息的傳遞。 但是在大量數(shù)據(jù)情況下,如果數(shù)據(jù)依然進(jìn)行Base64編碼,會(huì)帶來(lái)33%的額外開(kāi)銷(xiāo),這樣的情況對(duì)于大量數(shù)據(jù)交換的情況是無(wú)法容忍的。MTOM 就是針對(duì)SOAP 消息傳輸?shù)幕A(chǔ)上提出的改進(jìn)辦法。對(duì)于大量數(shù)據(jù)的傳遞,不會(huì)進(jìn)行進(jìn)行Base64編碼,而是直接以附件的二進(jìn)制原始數(shù)據(jù)的形式封裝在SOAP消息的MIME 部分,進(jìn)行傳輸。SOAP 消息通過(guò)指向隨其發(fā)送的 MIME 部分來(lái)引用二進(jìn)制內(nèi)容,另外包括SOAP基本的XML 數(shù)據(jù),這些還是Base64編碼。因?yàn)榇四P团c簡(jiǎn)單郵件協(xié)議SMTP 模型基本一致。 MTOM通過(guò)簡(jiǎn)化大量數(shù)據(jù)的編碼過(guò)程,從而提高數(shù)據(jù)的處理效率。因?yàn)镾OAP消息等必要的信息,MTOM 也有一些必要的開(kāi)銷(xiāo)。MTOM僅在二進(jìn)制數(shù)據(jù)元素的大小超過(guò)大約 1 KB 時(shí),才能體現(xiàn)出其優(yōu)勢(shì)。 2.【W(wǎng)SE3.0工具配置MTOM】 在WSE3.0項(xiàng)目中使用MTOM消息傳輸優(yōu)化機(jī)制非常的方便,我們可以使用WSE 3.0配置工具分別為Web 服務(wù)和Client客戶(hù)端設(shè)置啟用MTOM,生成相應(yīng)的策略文件,WSE3.0機(jī)制會(huì)根據(jù)策略對(duì)消息傳輸使用MTOM(也可以通過(guò)代碼實(shí)現(xiàn)) 。 數(shù)據(jù)使用字節(jié)流byte[]數(shù)組在客戶(hù)端和服務(wù)端進(jìn)行傳輸,簡(jiǎn)單的例子就是消息的交互和文件的上傳和下載操作。本次配置基本介紹的情況也是借助WSE3.0的安全機(jī)制實(shí)現(xiàn)文件的安全傳輸。 2.1首先使用WSE 3.0配置工具設(shè)置服務(wù)端消息傳輸策略。如圖: 客戶(hù)端設(shè)置為on,要求客戶(hù)端使用MTOM機(jī)制進(jìn)行數(shù)據(jù)傳輸。服務(wù)端設(shè)置為Optional,表示可選,服務(wù)端既支持MTOM又可以不支持MTOM編碼的消息。適用性強(qiáng)。 此種情況即服務(wù)端會(huì)根據(jù)客戶(hù)端的請(qǐng)求類(lèi)型來(lái)決定是否啟用MTOM機(jī)制進(jìn)行數(shù)據(jù)傳遞.如果客戶(hù)端適用MTOM編碼,則服務(wù)會(huì)啟用MTOM處理消息。如果設(shè)置為Always,服務(wù)端會(huì)一直使用MTOM機(jī)制進(jìn)行消息的傳遞。一般不推薦使用這個(gè)方式。OFF即一直不使用MTOM機(jī)制進(jìn)行消息傳遞。64為最大附加二進(jìn)制文件的個(gè)數(shù)。最后表示需要首先使用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. 對(duì)應(yīng)的配置文件為: ??? <messaging>
????? <mtom serverMode="optional" clientMode="On" />
??? </messaging> 2.2客戶(hù)端的設(shè)置與服務(wù)端類(lèi)似: 客戶(hù)端配置文件的代碼如下: ??? <messaging>
????? <mtom clientMode="On" serverMode="optional" />
??? </messaging> 3.【代碼實(shí)現(xiàn)與分析】 進(jìn)行完畢配置以后我們來(lái)具體進(jìn)入代碼的開(kāi)發(fā)階段。這里給出了使用MTOM上傳照片的例子,一個(gè)使用了證書(shū)加密圖片上傳。先給出服務(wù)端的實(shí)現(xiàn),包括兩個(gè)服務(wù)類(lèi):WSE3MTOMService和WSE3MTOMSecureService。方法都是二進(jìn)制字節(jié)數(shù)據(jù)流的傳遞。 3.1WSE3MTOMService直接實(shí)現(xiàn)基于MTOM機(jī)制的圖片上傳和下載方法,具體實(shí)現(xiàn)如下: //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()
??? {
??? } ??? //此方法返回不加密的字節(jié)數(shù)組,下載文件
??? [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進(jìn)制數(shù)據(jù)
??? [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定義了一個(gè)文件下載的方法。具體如下: //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通過(guò)服務(wù)端 X509 證書(shū)加密
??? // MTOM可以使用WS-Security安全協(xié)議.
??? [WebMethod]
??? public byte[] DownLoadFileWithSecurity(string fileName)
??? {
??????? byte[] file = null;
??????? String filePath = AppDomain.CurrentDomain.BaseDirectory + @"App_Data\" + fileName;
??????? file = File.ReadAllBytes(filePath);//從文件里讀取字節(jié)流
??????? return file;
??? }
} 3.3客戶(hù)端建立控制臺(tái)應(yīng)用程序,添加對(duì)Web服務(wù)的引用。實(shí)例化連個(gè)代理服務(wù)類(lèi),進(jìn)行文件的上傳和下載。具體代碼如下: //直接進(jìn)行數(shù)據(jù)傳輸,不需要加密
??????? public void DownLoadFile(String fileName)
??????? {
??????????? //實(shí)例化服務(wù)代理類(lèi)
??????????? WSE3MTOMServiceWse serviceproxy = new WSE3MTOMServiceWse();
??????????? //or alternatively set the RequireMtom property on the proxy
??????????? //serviceproxy.RequireMtom = true;
??????????? //獲取文件二進(jìn)制字節(jié)流
??????????? byte[] loadFile = serviceproxy.DownLoadFile(fileName); ??????????? //打印數(shù)據(jù)信息
??????????? 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);
??????????? //打印數(shù)據(jù)信息
??????????? 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);
??????? }
??????? //測(cè)試非加密安全上傳文件
??????? public void UpLoadFile(String fileName)
??????? {
??????????? String filePath = AppDomain.CurrentDomain.BaseDirectory + fileName;
??????????? //實(shí)例化服務(wù)代理
??????????? WSE3MTOMServiceWse serviceproxy = new WSE3MTOMServiceWse();
??????????? //讀取文件數(shù)據(jù)
??????????? byte[] upFile = File.ReadAllBytes(filePath);
??????????? //調(diào)用方法傳輸數(shù)據(jù)
??????????? serviceproxy.UpLoadFile(upFile);
??????????? //輸出上傳文件信息
??????????? Console.WriteLine("File Name: {0}", fileName);
??????????? Console.WriteLine("File has been uploaded sucessfully from Client: {0}", upFile.Length);
??????? } 運(yùn)行結(jié)果如圖: 首先是上傳一個(gè)文件到服務(wù)器端,然后進(jìn)行下載操作。均顯示成功。可以在程序的運(yùn)行目錄下找到下載的新文件。 4.【總結(jié)】 通過(guò)以上的介紹和學(xué)習(xí),我們知道了一下結(jié)論: 1.MTOM機(jī)制會(huì)效率提升1/3.原因:正常文本 XML 使用 Base64 對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行編碼,這要求每三個(gè)字節(jié)對(duì)應(yīng)四個(gè)字符,從而使得數(shù)據(jù)的大小增加三分之一。MTOM 能夠以原始字節(jié)形式傳輸二進(jìn)制數(shù)據(jù),這會(huì)縮短編碼/解碼時(shí)間并生成較小的消息。 2.使用的場(chǎng)合:MTOM適合大量的數(shù)據(jù)交換,通常是大量數(shù)據(jù)情況下才有優(yōu)勢(shì), 如上傳文檔和圖片,目的在于優(yōu)化對(duì)較大的二進(jìn)制負(fù)載的傳輸。 3.缺陷:對(duì)于較小的二進(jìn)制負(fù)載來(lái)說(shuō),使用 MTOM 發(fā)送 SOAP 消息會(huì)產(chǎn)生顯著的開(kāi)銷(xiāo)。 另外提供本文的代碼下載。以供大家學(xué)習(xí)參考,代碼下載連接/Files/frank_xl/WSE3MTOM_FrankXuLei.rar。如有意見(jiàn)也歡迎交流~ Web服務(wù)駐留在IIS外,可以由系統(tǒng)服務(wù)、控制臺(tái)程序等托管的方式比較簡(jiǎn)單,大家可以參考微軟的例子,這個(gè)WCF里也有類(lèi)似的寄宿宿主的概念。其實(shí)有許多相似之處。 最后在準(zhǔn)備《WSE3.0構(gòu)建Web服務(wù)安全》系列文章的過(guò)程中,我也收獲不少,也希望本系列文能給您的學(xué)習(xí)帶來(lái)一些幫助。包括我之前的《WCF分布式開(kāi)發(fā)必備知識(shí)》系列都是學(xué)習(xí)WCF分布式重要知識(shí)點(diǎn)的總結(jié)。并且全部給出了詳細(xì)的代碼實(shí)現(xiàn)和注釋。方便大家的學(xué)習(xí)和實(shí)際項(xiàng)目的應(yīng)用。下面我們將正式進(jìn)入WCF分布式開(kāi)發(fā)的學(xué)習(xí)階段,我會(huì)繼續(xù)給出系統(tǒng)的介紹和詳細(xì)的實(shí)現(xiàn)代碼。希望有興趣的朋友繼續(xù)關(guān)注~謝謝 1.WSE3.0安全機(jī)制與實(shí)例開(kāi)發(fā) 2.非對(duì)稱(chēng)加密、公鑰、密鑰、證書(shū)、簽名的區(qū)別和聯(lián)系以及X.509 證書(shū)的獲得和管理 3.WSE3.0策略配置、證書(shū)、簽名、與實(shí)例開(kāi)發(fā) 參考資料: 1.BASE64編碼基于十進(jìn)制的實(shí)現(xiàn)方法 2.MTOM編碼 MSDN
??? 1.【MTOM基礎(chǔ)概念】 提到MTOM消息優(yōu)化傳輸機(jī)制,通常的實(shí)驗(yàn)結(jié)果是使用MTOM傳輸數(shù)據(jù)會(huì)提高大約33%的性能。 消息傳輸優(yōu)化機(jī)制 (MTOM) 標(biāo)準(zhǔn)允許將消息中包含的大型數(shù)據(jù)元素外部化,并將其作為無(wú)任何特殊編碼的二進(jìn)制數(shù)據(jù)隨消息一起傳送。MTOM 消息會(huì)打包為多部分/相關(guān) MIME 序列,放在SOAP 消息中一起傳送。 我們需要了解一些相關(guān)的概念。什么是BASE64編碼、MTOM消息優(yōu)化傳輸機(jī)制、MIME。這些對(duì)于我們理解MTOM消息優(yōu)化傳輸機(jī)制問(wèn)題非常的必要。下面就來(lái)做下介紹。 1.1【BASE64編碼】 BASE64編碼 的原理很簡(jiǎn)單,其方法是,將輸入數(shù)據(jù)流每次取6 bit(每bit代表1位二進(jìn)制),不足6bit的補(bǔ)0,這樣,每3個(gè)8位字節(jié)將編碼為4個(gè)6位字節(jié)(3×8 → 4×6);不滿4個(gè)字節(jié)的以“=”填充。其實(shí)這4個(gè)六位字節(jié) 仍然是8位,只不過(guò)高兩位被設(shè)置為0。當(dāng)一個(gè)字節(jié)只有6位有效時(shí),它的取值空間為0 到 2的6次方減1 即63,也就是說(shuō)被轉(zhuǎn)換的Base64編碼的每一個(gè)編碼的取值空間為(0~63)。 這樣就可以將3個(gè)8位字節(jié),轉(zhuǎn)換為4個(gè)字節(jié),這4個(gè)轉(zhuǎn)換的字節(jié)都可以映射到字符中。也即數(shù)據(jù)都可以使用字符編碼代替。 因?yàn)檗D(zhuǎn)換后的字符串要比原來(lái)的多一個(gè)字節(jié),長(zhǎng)1/3。因此編碼后的數(shù)據(jù)長(zhǎng)度增加到4/3倍。這里也是為什么使用SOAP消息效率比MTOM低的原因。因?yàn)镾OAP使用XML語(yǔ)言進(jìn)行消息傳遞,XML是基于BASE64編碼的語(yǔ)言。 1.2【MIME】 ?????MIME表示多用途Internet郵件擴(kuò)允協(xié)議。MIME擴(kuò)允了基本的面向文本的Internet郵件系統(tǒng),以便可以在消息中包含二進(jìn)制附件。MIME(Multipurpose Internet Mail Extentions),一般譯作"多用途的網(wǎng)絡(luò)郵件擴(kuò)充協(xié)議"。顧名思義,它可以傳送多媒體文件。 MIME (Multipurpose Internet Mail Extensions,多目的Internet郵件擴(kuò)展)是創(chuàng)建用于電子郵件交換,網(wǎng)絡(luò)文檔,及企業(yè)網(wǎng)和Internet上的其他應(yīng)用程序中的文件格式的規(guī)范。 1.3【MTOM消息優(yōu)化傳輸】 MTOM 全稱(chēng)Message Transmission Optimization Mechanism,即消息傳輸優(yōu)化機(jī)制。它提出的模型適用于大量數(shù)據(jù)的交互情況。針對(duì)Base64編碼情況帶來(lái)的開(kāi)銷(xiāo)提出的解決方案。當(dāng)數(shù)據(jù)量小的時(shí)候,SOAP依然使用XML進(jìn)行消息的傳遞。 但是在大量數(shù)據(jù)情況下,如果數(shù)據(jù)依然進(jìn)行Base64編碼,會(huì)帶來(lái)33%的額外開(kāi)銷(xiāo),這樣的情況對(duì)于大量數(shù)據(jù)交換的情況是無(wú)法容忍的。MTOM 就是針對(duì)SOAP 消息傳輸?shù)幕A(chǔ)上提出的改進(jìn)辦法。對(duì)于大量數(shù)據(jù)的傳遞,不會(huì)進(jìn)行進(jìn)行Base64編碼,而是直接以附件的二進(jìn)制原始數(shù)據(jù)的形式封裝在SOAP消息的MIME 部分,進(jìn)行傳輸。SOAP 消息通過(guò)指向隨其發(fā)送的 MIME 部分來(lái)引用二進(jìn)制內(nèi)容,另外包括SOAP基本的XML 數(shù)據(jù),這些還是Base64編碼。因?yàn)榇四P团c簡(jiǎn)單郵件協(xié)議SMTP 模型基本一致。 MTOM通過(guò)簡(jiǎn)化大量數(shù)據(jù)的編碼過(guò)程,從而提高數(shù)據(jù)的處理效率。因?yàn)镾OAP消息等必要的信息,MTOM 也有一些必要的開(kāi)銷(xiāo)。MTOM僅在二進(jìn)制數(shù)據(jù)元素的大小超過(guò)大約 1 KB 時(shí),才能體現(xiàn)出其優(yōu)勢(shì)。 2.【W(wǎng)SE3.0工具配置MTOM】 在WSE3.0項(xiàng)目中使用MTOM消息傳輸優(yōu)化機(jī)制非常的方便,我們可以使用WSE 3.0配置工具分別為Web 服務(wù)和Client客戶(hù)端設(shè)置啟用MTOM,生成相應(yīng)的策略文件,WSE3.0機(jī)制會(huì)根據(jù)策略對(duì)消息傳輸使用MTOM(也可以通過(guò)代碼實(shí)現(xiàn)) 。 數(shù)據(jù)使用字節(jié)流byte[]數(shù)組在客戶(hù)端和服務(wù)端進(jìn)行傳輸,簡(jiǎn)單的例子就是消息的交互和文件的上傳和下載操作。本次配置基本介紹的情況也是借助WSE3.0的安全機(jī)制實(shí)現(xiàn)文件的安全傳輸。 2.1首先使用WSE 3.0配置工具設(shè)置服務(wù)端消息傳輸策略。如圖: 客戶(hù)端設(shè)置為on,要求客戶(hù)端使用MTOM機(jī)制進(jìn)行數(shù)據(jù)傳輸。服務(wù)端設(shè)置為Optional,表示可選,服務(wù)端既支持MTOM又可以不支持MTOM編碼的消息。適用性強(qiáng)。 此種情況即服務(wù)端會(huì)根據(jù)客戶(hù)端的請(qǐng)求類(lèi)型來(lái)決定是否啟用MTOM機(jī)制進(jìn)行數(shù)據(jù)傳遞.如果客戶(hù)端適用MTOM編碼,則服務(wù)會(huì)啟用MTOM處理消息。如果設(shè)置為Always,服務(wù)端會(huì)一直使用MTOM機(jī)制進(jìn)行消息的傳遞。一般不推薦使用這個(gè)方式。OFF即一直不使用MTOM機(jī)制進(jìn)行消息傳遞。64為最大附加二進(jìn)制文件的個(gè)數(shù)。最后表示需要首先使用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. 對(duì)應(yīng)的配置文件為: ??? <messaging>
????? <mtom serverMode="optional" clientMode="On" />
??? </messaging> 2.2客戶(hù)端的設(shè)置與服務(wù)端類(lèi)似: 客戶(hù)端配置文件的代碼如下: ??? <messaging>
????? <mtom clientMode="On" serverMode="optional" />
??? </messaging> 3.【代碼實(shí)現(xiàn)與分析】 進(jìn)行完畢配置以后我們來(lái)具體進(jìn)入代碼的開(kāi)發(fā)階段。這里給出了使用MTOM上傳照片的例子,一個(gè)使用了證書(shū)加密圖片上傳。先給出服務(wù)端的實(shí)現(xiàn),包括兩個(gè)服務(wù)類(lèi):WSE3MTOMService和WSE3MTOMSecureService。方法都是二進(jìn)制字節(jié)數(shù)據(jù)流的傳遞。 3.1WSE3MTOMService直接實(shí)現(xiàn)基于MTOM機(jī)制的圖片上傳和下載方法,具體實(shí)現(xiàn)如下: //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()
??? {
??? } ??? //此方法返回不加密的字節(jié)數(shù)組,下載文件
??? [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進(jìn)制數(shù)據(jù)
??? [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定義了一個(gè)文件下載的方法。具體如下: //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通過(guò)服務(wù)端 X509 證書(shū)加密
??? // MTOM可以使用WS-Security安全協(xié)議.
??? [WebMethod]
??? public byte[] DownLoadFileWithSecurity(string fileName)
??? {
??????? byte[] file = null;
??????? String filePath = AppDomain.CurrentDomain.BaseDirectory + @"App_Data\" + fileName;
??????? file = File.ReadAllBytes(filePath);//從文件里讀取字節(jié)流
??????? return file;
??? }
} 3.3客戶(hù)端建立控制臺(tái)應(yīng)用程序,添加對(duì)Web服務(wù)的引用。實(shí)例化連個(gè)代理服務(wù)類(lèi),進(jìn)行文件的上傳和下載。具體代碼如下: //直接進(jìn)行數(shù)據(jù)傳輸,不需要加密
??????? public void DownLoadFile(String fileName)
??????? {
??????????? //實(shí)例化服務(wù)代理類(lèi)
??????????? WSE3MTOMServiceWse serviceproxy = new WSE3MTOMServiceWse();
??????????? //or alternatively set the RequireMtom property on the proxy
??????????? //serviceproxy.RequireMtom = true;
??????????? //獲取文件二進(jìn)制字節(jié)流
??????????? byte[] loadFile = serviceproxy.DownLoadFile(fileName); ??????????? //打印數(shù)據(jù)信息
??????????? 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);
??????????? //打印數(shù)據(jù)信息
??????????? 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);
??????? }
??????? //測(cè)試非加密安全上傳文件
??????? public void UpLoadFile(String fileName)
??????? {
??????????? String filePath = AppDomain.CurrentDomain.BaseDirectory + fileName;
??????????? //實(shí)例化服務(wù)代理
??????????? WSE3MTOMServiceWse serviceproxy = new WSE3MTOMServiceWse();
??????????? //讀取文件數(shù)據(jù)
??????????? byte[] upFile = File.ReadAllBytes(filePath);
??????????? //調(diào)用方法傳輸數(shù)據(jù)
??????????? serviceproxy.UpLoadFile(upFile);
??????????? //輸出上傳文件信息
??????????? Console.WriteLine("File Name: {0}", fileName);
??????????? Console.WriteLine("File has been uploaded sucessfully from Client: {0}", upFile.Length);
??????? } 運(yùn)行結(jié)果如圖: 首先是上傳一個(gè)文件到服務(wù)器端,然后進(jìn)行下載操作。均顯示成功。可以在程序的運(yùn)行目錄下找到下載的新文件。 4.【總結(jié)】 通過(guò)以上的介紹和學(xué)習(xí),我們知道了一下結(jié)論: 1.MTOM機(jī)制會(huì)效率提升1/3.原因:正常文本 XML 使用 Base64 對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行編碼,這要求每三個(gè)字節(jié)對(duì)應(yīng)四個(gè)字符,從而使得數(shù)據(jù)的大小增加三分之一。MTOM 能夠以原始字節(jié)形式傳輸二進(jìn)制數(shù)據(jù),這會(huì)縮短編碼/解碼時(shí)間并生成較小的消息。 2.使用的場(chǎng)合:MTOM適合大量的數(shù)據(jù)交換,通常是大量數(shù)據(jù)情況下才有優(yōu)勢(shì), 如上傳文檔和圖片,目的在于優(yōu)化對(duì)較大的二進(jìn)制負(fù)載的傳輸。 3.缺陷:對(duì)于較小的二進(jìn)制負(fù)載來(lái)說(shuō),使用 MTOM 發(fā)送 SOAP 消息會(huì)產(chǎn)生顯著的開(kāi)銷(xiāo)。 另外提供本文的代碼下載。以供大家學(xué)習(xí)參考,代碼下載連接/Files/frank_xl/WSE3MTOM_FrankXuLei.rar。如有意見(jiàn)也歡迎交流~ Web服務(wù)駐留在IIS外,可以由系統(tǒng)服務(wù)、控制臺(tái)程序等托管的方式比較簡(jiǎn)單,大家可以參考微軟的例子,這個(gè)WCF里也有類(lèi)似的寄宿宿主的概念。其實(shí)有許多相似之處。 最后在準(zhǔn)備《WSE3.0構(gòu)建Web服務(wù)安全》系列文章的過(guò)程中,我也收獲不少,也希望本系列文能給您的學(xué)習(xí)帶來(lái)一些幫助。包括我之前的《WCF分布式開(kāi)發(fā)必備知識(shí)》系列都是學(xué)習(xí)WCF分布式重要知識(shí)點(diǎn)的總結(jié)。并且全部給出了詳細(xì)的代碼實(shí)現(xiàn)和注釋。方便大家的學(xué)習(xí)和實(shí)際項(xiàng)目的應(yīng)用。下面我們將正式進(jìn)入WCF分布式開(kāi)發(fā)的學(xué)習(xí)階段,我會(huì)繼續(xù)給出系統(tǒng)的介紹和詳細(xì)的實(shí)現(xiàn)代碼。希望有興趣的朋友繼續(xù)關(guān)注~謝謝 1.WSE3.0安全機(jī)制與實(shí)例開(kāi)發(fā) 2.非對(duì)稱(chēng)加密、公鑰、密鑰、證書(shū)、簽名的區(qū)別和聯(lián)系以及X.509 證書(shū)的獲得和管理 3.WSE3.0策略配置、證書(shū)、簽名、與實(shí)例開(kāi)發(fā) 參考資料: 1.BASE64編碼基于十進(jìn)制的實(shí)現(xiàn)方法 2.MTOM編碼 MSDN
總結(jié)
以上是生活随笔為你收集整理的WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【转载】2009年.NET技术大会讲义(
- 下一篇: css 优先级