国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

.NET 和智能傳輸服務API編寫自動更新程序

2019-11-18 12:01:52
字體:
來源:轉載
供稿:網友

  我必須承認,我喜歡 Windows? Update 功能。 在我的計算機開機的時間中,大約有 85% 的時間都連接到了 Internet 上,但是,像許多人一樣,我當然不會這么多時間都在使用網絡。 Windows xp 利用了這一未用的帶寬,將網上可用的最新服務包和修補程序與我計算機上已安裝的服務包和修補程序進行比較。 假如它找到了我需要的更新,便會在后臺將它們下載下來。 完成后,Windows 會通知我計算機上有需要安裝的新軟件包。
  
  假如可以選擇的話,我希望讓客戶端上的每一個應用程序都像 Windows 一樣答應自動更新。 現在有許多有利的條件以及現成的連接來實現這一功能。 假如要使應用程序自動進行自我更新,必須編寫代碼來處理發現、下載、安全性以及替換等方面的問題。
  
  為了處理實際的下載,我將介紹 Windows 的一項新功能:后臺智能傳輸服務 (BITS)。 在討論此功能之后,我將介紹 .NET Framework 中可用來解決自動更新應用程序的安全性和替換問題的功能。
  
  請注重,雖然 BITS 1.5 可重新發布軟件可以很好地工作在 windows 2000 和 Windows XP 上,但是 Microsoft 不打算在 Windows 9x 或 Windows Me 上支持 BITS API。 BITS 有望作為 Windows 的將來版本的一個組件提供。
  
  但是,在開始下面的內容之前,需要指出的重要一點是:要使您的應用程序能夠使用本文所介紹的技術,需要在 .NET 下對它進行治理。 BITS 自身是操作系統的一部分,而這里介紹的 .NET Framework 技術可以用于非托管的應用程序的自動更新功能。
  
  困難
  為了找到遠程服務器上的更新,您的應用程序需要一種查詢網絡的手段。 這需要網絡代碼以及使應用程序和服務器可以用來彼此通信的簡單協議。 我將在本文的后面繼續探討“發現”這個話題。
  
  接下來您還必須能夠下載軟件包。 由于 .NET 在網絡方面駕輕就熟,因此下載可能看上去不像是一個大問題,但是下載用戶所請求的文件僅僅是一個方面。另一個方面是在未經用戶同意的情況下下載大型文件。 禮貌的自動更新應用程序僅僅使用殘留的帶寬來下載更新。 這聽起來很不錯,但是,您會看到,它帶來了一個相當困難的技術問題。 幸運的是,相應的解決方案已存在。
  
  安全可能是首當其沖的一個問題。 請花一點時間想一想 Windows Update 功能。 它的一個主要目的是獲取安全修補程序。 想想,假如 Windows Update 自身都不能確認它安裝的是否是安全的代碼,情況會怎么樣? 顯而易見,從 Internet 上下載代碼并執行該代碼的任何應用程序都必須將安全性作為一個首要問題。 因此,我將探討如何確保自動更新應用程序的安全性。
  
  最后一個需要考慮的因素是使用應用程序自身的新版本來替換應用程序的過程。 此問題之所以引人關注,是因為它要求代碼在將自身從系統中刪除時能夠運行。 處理這一技巧有許多種方法。
  
  關于這些困難,最慶幸的一件事情是在 .NET Framework 與 Windows 之間,所有工具都是現成的,可以馬上用來解決這些問題。
  
  BITS 基礎知識
  BITS 是 Windows 中新增的一項非常實用的文件傳輸功能,它通過 HTTP 異步地從遠程服務器上下載文件。 BITS 可以專門利用空閑帶寬來處理多個用戶的多個下載任務。 盡管 BITS 不僅僅限于自動更新應用程序使用,但它是 Windows Update 使用的基礎 API。 并且,由于它可用于任何應用程序,因此可用來完成創建自動更新應用程序的過程中所涉及到的大部分非常困難的工作。
  
  下面是基本思想。 應用程序請求 BITS 處理一個或一組文件的下載。 BITS 將該任務添加到自己的隊列中,并將該任務與應用程序所運行在的用戶上下文關聯。 只要用戶登錄,BITS 就會利用空閑帶寬在網絡中細細搜尋 (Drizzle) 這些文件。 事實上,BITS 技術的代號名稱就是 Drizzle,這個詞被證實是 BITS 所執行的工作的一個非常恰當的描述。
  
  那么它到底是怎樣工作的呢? 這項技術實際是一項非常復雜的技術。 首先,BITS 是作為一個 Windows 服務實現的,它維護組織成一組優先級隊列的任務集合。 優先級包括前臺、高、普通和低。 它按照循環法的原則,通過大約五分鐘的時間片為同一優先級的每個任務分配帶寬。 一旦隊列中沒有剩余的任務,便立即檢查下一個優先級隊列中的任務。
  
  前臺隊列中的任務使用盡可能多的網絡帶寬,由于這一原因,前臺優先級應只供響應用戶請求的代碼使用。 余下的優先級(高、普通和低)遠遠比前臺優先級更引人關注,因為它們全都是后臺優先級,也就是說,它們僅僅使用未用的網絡帶寬。
  
  為了實現此后臺功能,BITS 監視網絡數據包,并忽略不屬于它的數據包。 余下的數據包被認為是計算機帶寬上的活動負載。 BITS 使用活動負載信息以及連接速度和其他某些統計信息來確定應繼續下載文件還是暫停(以增加活動用戶的吞吐量)。 因此,用戶不會碰到帶寬問題。
  
  能夠立即中斷所做的工作對于 BITS 是非常重要的。 在許多情況下,BITS 不得不在僅僅下載了文件的一部分的情況下放棄與網絡的連接甚至完全斷開連接。 但是,下載了一部分的文件會保存起來,這樣,當 BITS 抓住了與網絡連接的片刻機會時,便能夠從中斷的位置繼續下載。 這種恢復功能也有一些副作用。
  
  請記住 BITS 是用于從 HTTP 服務器傳輸文件的。 要使 BITS 能夠工作,服務器應與 HTTP 1.1 兼容,或者至少支持 GET 方法中的 Range 頭。 這是因為 BITS 需要能夠請求文件的一部分。 此外,下載的內容必須是靜態內容,例如,標記文件、代碼文件、位圖或聲音。 當請求動態內容(例如,CGI、ISAPI 或 asp.net 產生的內容)時,包含 Range 頭的 GET 請求沒有意義。
  
  當前,BITS 有兩個版本: 1.0 和 1.5。 BITS 1.0 隨同 Windows XP 一起提供,它具有下列功能: 可與對話框及其他 UI 元素一起使用的可中斷后臺文件下載、下載優先級、任務完成及出錯時的可選通知以及可選的進度通知。 BITS 1.5 隨同 Windows .NET Server 一起提供。 除了 BITS 1.0 中包含的功能外,1.5 版還具有可中斷的后臺文件上載以及使用“基本”、“摘要”、“NTLM”、“協商”(Kerberos) 或“Passport”對連接進行身份驗證的功能。 BITS 1.5 還作為與 Windows 2000 及更高版本兼容的可重新發布軟件提供(請參閱后臺智能傳輸服務)。
  
  BITS 1.0 中的全部功能對于編寫自動更新應用程序已夠用,但是使用 BITS 1.5 功能可以執行更復雜的任務,例如,出售更新或處理應用程序與服務器之間的交互。
  
  BITS、COM 和托管代碼
  BITS API 是作為 COM 對象實現的,正因為此,所以不能編寫 .NET Framework 版的 API。 幸運的是,BITS API 非常簡單易用。 本文所包含的示例應用程序是使用 C# 編寫的,因此為了使用 BITS API,我不得不硬著頭皮使用 .NET Framework 的 COM Interop 功能。 我在這里不深入探討運行庫可調用包裝 (RCW) 及相關的內容,而僅僅說明我使用此 API 所遵循的過程。
  
  假如我使用的是 C++,那么我的 BITS 代碼的開頭部分可能如下所示:
  
  IBackgroundCopyManager* pBCM = NULL;
  
  hr = CoCreateInstance(__uuidof(BackgroundCopyManager), NULL,
     CLSCTX_LOCAL_SERVER, __uuidof(IBackgroundCopyManager),
     (void**) &pBCM);
  if (SUCCEEDED(hr)) {
  // Party-on with the pBCM interface pointer
  }
  
  等效的 C# 代碼使用 new 要害字創建 BackgroundCopyManager 對象,然后通過轉換獲得對 IBackgroundCopyManager 接口的引用,而不是通過調用像 CoCreateInstance 或 QueryInterface 這樣的方法。 下面的代碼片段是 C# 示例,它的作用是獲取 IBackgroundCopyManager 接口:
  
  IBackgroundCopyManager bcm = null;
  // Create BITS object
  bcm = (IBackgroundCopyManager)new BackgroundCopyManager();
  
  此代碼的簡單性有一點誤導的作用,因為需要做更多的工作來分別將托管的 BackgroundCopyManager 和 IBackgroundCopyManager 類型與底層的 COM 對象和接口關聯。 .NET Framework 通過 RCW 來處理與 COM 對象的交互。 要將托管類型與 RCW 關聯,必須使用屬性。 圖 1 中的代碼說明了如何聲明 BackgroundCopyManager 類和 IBackgroundCopyManager 接口,以使它們表示 BITS COM 對象。
  
 .NET 和智能傳輸服務API編寫自動更新程序

  圖 1 中的代碼有很多的屬性(ComImportAttribute、GuidAttribute、MarshalAsAttribute 等等),這使真正的代碼看起來不明顯。 事實上,沒有真正的代碼。 接口和類的定義實際上僅僅是元數據形式的封送占位符,公共語言運行庫 (CLR) 用它來直接調用 BITS COM API。
  
  代碼示例(請見本文頂部的鏈接)所包含的 InteropBits.cs 文件提供了與 BITS API 一起使用的所有接口、枚舉類型及結構的 C# Interop 代碼。 盡管示例僅僅使用了幾個方法,但是我提供了完整的實現,因為它有助于您探索此 API 的更多功能。 值得注重的一點是,InteropBits.cs 文件中的代碼不是托管 API,而是 COM API 實現之上的 Interop API。 Microsoft 終有一天會發布通過與 .NET Framework 類庫的其余部分一致的方法向 .NET Framework 代碼公開 BITS 功能的 API。
  
  圖 1 中的代碼以及 InteropBits.cs 示例文件中的完整實現是手動創建的。 .NET Framework SDK 自帶一個名為 TlbImp.exe 的工具。假如您有一個描述所針對的 COM API 的 TLB 文件,可以使用此工具創建類似的代碼,并將其編譯為托管程序集。 BITS API 不自帶 TLB 文件,但是,Platform SDK 中包含一個名為 Bits.idl 的接口定義文件,該文件

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 奈曼旗| 屯留县| 吉木萨尔县| 锦州市| 孟津县| 双峰县| 廊坊市| 武宁县| 三江| 张家口市| 金乡县| 芦山县| 柞水县| 萨迦县| 南充市| 崇义县| 全南县| 稻城县| 仪征市| 桐乡市| 石泉县| 桦甸市| 河源市| 托里县| 松溪县| 梁平县| 江源县| 讷河市| 郯城县| 独山县| 武威市| 江达县| 宣威市| 郸城县| 邵阳市| 张家口市| 北宁市| 蛟河市| 朝阳县| 福州市| 增城市|