2011-10-04 56 views
2

我已經繼承了ASP.NET(.net 3.5)web應用程序以及相應的C#客戶端組件和相關的javascript客戶端。縮小選項從WebMethods返回的ASP.NET 3.5 XML文檔

服務器端組件使用默認的[WebMethod]序列化,並且考慮到我們一些XML文檔的大小(以及元素名稱的詳細程度),我很想知道縮小文檔大小的選項回。我開放給二進制XML,XML的自定義序列化(例如,將ThisVeryLongElementNameWhichShowsUpALot更改爲更短的東西),簡單壓縮,移動到JSON等。我們確實有相當多的單個WebMethods和不同的對象返回,所以理想的解決方案將涉及在等式兩邊儘可能少地改變。

據我所知,會有CPU /帶寬折衷做壓縮或自定義序列化之類的事情,所以我想在沒有構建大量代碼的情況下對某些選項進行基準測試。

有人可以請相關文檔或IIS/VS.NET選項指向我來探討這些折衷?

回答

2

我想了解如何設置壓縮級別,最近測試了IIS壓縮並對結果感到滿意。最終的結果是將一個196 kb的JSON結果壓縮爲13.6 kb。

下面是我爲自己設置動態壓縮和設置壓縮級別所做的一些說明。我很抱歉,如果他們粗糙,我主要是爲了我自己的未來參考。

此外,我肯定會建議嘗試JSON over XML,因爲它提供了一個更加緊湊的結果。我沒有具體的數字,但我的回憶是,JSON比XMl小了約50%。


安裝動態壓縮如有必要

的Windows 7:

  1. 打開程序和功能,從開始 - >控制面板>程序和功能控制檯。
  2. 單擊「打開或關閉Windows功能」。
  3. 在該對話框中,展開Internet信息服務>萬維網服務>性能功能,然後啓用動態內容壓縮。
  4. 單擊確定。

的Windows Server 2008:

  1. 打開服務器管理器開始>所有程序>管理工具>服務器管理器控制檯。
  2. 在服務器管理器樹視圖中,展開角色,然後單擊Web服務器(IIS)。
  3. 在主窗口中,向下滾動到角色服務面板,然後單擊添加角色服務。
  4. 在選擇角色服務對話框中,單擊並啓用Web服務器(安裝)>性能(安裝)>動態內容壓縮。
  5. 單擊下一步。
  6. 在確認安裝選擇屏幕上,單擊安裝。

在IIS

  1. 在IIS管理軟件來實現動態壓縮,選擇服務器,IIS的功能組中,雙擊 「壓縮」。
  2. 選中「啓用動態內容壓縮」。

啓用 「應用/ JSON」 和 「應用程序/ XML」

  1. 查找在c applicationHost.config文件:\ WINDOWS \ SYSTEM32 \ inetserv \ CONFIG
  2. 編輯它,找到httpCompression元素。
  3. <dynamicTypes>,添加以下元素:
<add mimeType="application/json" enabled="true" /> 
<add mimeType="application/xml" enabled="true" /> 

重新啓動IIS。

要驗證,請檢查Fiddler並確保未選擇「解碼」按鈕(解碼按鈕應位於主工具欄上)。您應該看到的是,響應「內容編碼」標題顯示「gzip的」,並且響應被壓縮:

enter image description here

高級設置

使用以下命令設置壓縮等級(默認級別爲0):

C:\Windows\System32\Inetsrv\Appcmd.exe 
    set config -section:httpCompression 
    -[name='gzip'].staticCompressionLevel:9 
    -[name='gzip'].dynamicCompressionLevel:4 

請訪問以下網站了解更多詳細信息:

Making the most out of IIS compression - Part 1: IIS 7 configuration

IIS 7 Compression. Good? Bad? How much?

我的JSON響應的初步測試:

None:   196,416 bytes 
Level 0:  35,234 
Level 1:  29,219 
Level 4:  18,461 
Level 9:  13,638 
+0

太棒了 - 謝謝! –

1

可以裝飾你的類,屬性和方法與告訴ASPNET如何序列化屬性。您有生產「小」 XML幾個選項:

  • 與VeryLongNames性質,使用[XmlElement]屬性,並指定一個替代方案,較短的名稱。任何簡短的元素名稱都可以,只要確保它是唯一的。請記住,這會降低可讀性。 XML旨在易於理解,便於處理。 <StudentUserId>19820</StudentUserId>有明確的含義,而<u>19820</u>沒有。

  • 如果你不介意去混合模型,你可以序列化一些簡單的數量作爲屬性而不是元素。例如,對於42的簡單整數值,要作爲屬性序列化的文本是PropName='42',而要序列化爲元素的文本是<PropName>42</PropName>。所以,無論名稱的長度如何,您都可以將尺寸縮小近一半。有些人反對序列化XML屬性。我從來不明白爲什麼這是嚴厲的,所以我認爲這是一個壓縮xml的好方法。

  • 有一些將數組序列化爲XML的選項。使用XmlArrayItem爲數組生成較小的表單。見this MSDN article for more info

除了使用屬性,還有你可以考慮一些其他的東西....

  • 檢查你的XML消息,以確保您的序列化,你只需要什麼,那是你序列化沒有以低效的方式被序列化。例如,如果您發送的是32k二進制圖像,則傳輸HTTP URL可能會更好,並讓應用程序執行額外請求來獲取圖像,而不是將圖像打包到XML信封中。或者,使用MTOM而不是XML序列化。

  • 考慮優化您的部分消息。你總是需要序列化一切嗎?你可以參數化你的webmethods,以允許調用者要求或多或少的每個回覆的細節?

  • 您是否有效地使用XML名稱空間?不要無緣無故地使用多個名稱空間。它只會增加消息的大小和複雜性。另一方面,如果您有充分的理由使用多個xml命名空間,請不要放棄這些原因以節省空間。

  • 考慮是否值得投入時間和精力來優化XML有效負載大小。什麼是真正的回報?如果您花費4周的時間進行優化和測試以獲得4%的吞吐量,是否值得呢?您是否可以通過擴展或優化網絡佈局來做得更好?