Share via


開放式封裝慣例的定址模型

 

DavidMelzer 和 Andrey Shur
Microsoft Corporation

2006 年 6 月

適用於:
   開放式封裝慣例
   Microsoft Office 2007
   Microsoft Windows Vista
   Microsoft .NET Framework

總結:本文提供開放式封裝慣例中使用的定址模型概觀,包括封裝及其元件的定址方式、封裝元件中的相對參考解析方式,以及應用程式如何使用套件定址模型搭配.NET Framework和類別的協助。 (16 個列印的頁面)

目錄

序言
定址模型
「pack:」 URI 的程式設計支援
參考資料

序言

在 Office 2007 和 Windows Vista 的設計中,Microsoft 引進 了開放式封裝慣例。 這些慣例描述如何在「套件」中組織內容。部分內容範例包括檔、媒體集合和應用程式程式庫。 封裝會將內容的所有元件匯總成單一物件。

例如,文字處理應用程式可能會使用套件來儲存檔的頁面、所需的字型,以及頁面上的影像、圖表和批註。 檔檢視或管理應用程式只能顯示套件中內容的一部分。 應用程式可以使用封裝型格式,例如 XML 紙張規格 (XPS) ,將固定版面配置內容和資源傳送至印表機。

本文提供開放式封裝慣例中使用的定址模型概觀,包括封裝及其元件的定址方式,以及如何解析套件元件中的相對參考。 本文也會討論應用程式如何使用套件定址模型搭配.NET Framework和.NET Framework 3.0 類別的協助。 本文主要是針對將處理、產生或取用套件的應用程式開發人員所撰寫。

如需實作封裝定址模型所需的完整規範資訊,請參閱開放式封裝慣例的規格。 .NET Framework 3.0 和 .NET SDK 提供所討論類別和方法的詳細資訊。

本概觀中呈現的內容假設有 URI 規格的基本知識。 下列詞彙會根據 RFC 3986 使用: URIURI 參考配置元件授權元件路徑元件、路徑元件、 路徑絕對相對參考URI一詞一律代表 URI 的絕對形式—配置元件存在,而所有其他元件都符合配置特定的文法。 可 定址一詞,如這裡所示,表示 URI 存在可識別資源的 URI。

定址模型

開放式封裝慣例會定義邏輯模型來組織套件的內容和資源,並根據 ZIP、XML 和其他開放可用的技術,提供從此邏輯模型到實體標記法的對應。

開放式封裝慣例所描述的邏輯 封裝模型 會定義保存元件集合的封裝抽象概念。 元件可以彼此有關聯性,而封裝可以與元件有關聯性。 封裝模型會指定封裝中的元件如何命名、參考和相關。 慣例所定義的 定址模型 是能夠參考和取得封裝中元件資源的基礎。

可定址套件資源

整體 套件實例 是可定址的資源,如同封裝實例中保留的每個部分一樣。

將封裝定址為單位

應用程式可以使用 URI 搭配任何配置 (,例如 「HTTP:」、「ftp:」,依此類) 將封裝定址為單位,取得包含整個封裝的位資料流程。

應用程式也可以使用開放式封裝慣例所定義的「pack:」 URI 配置來解決套件。 此配置會指定識別封裝的完整 URI 會以編碼形式保留在 「pack:」 URI 的授權元件中。

範例:定址套件

套件資源會分別由 「HTTP:」 和 「pack:」 URI 定址, (下列範例中分別) :

http://www.site.com/windows/p1.xps

pack://HTTP%3a,www.site.com,windows,p1.xps/

取得套件資源的 MIME 類型表示套件的檔案格式,例如,它可以是 XPS 檔案格式 (.xps) 、Office Open XML 格式 (.docx) ,或符合開放式封裝慣例的其他格式。

基於各種原因 (例如改善效能) ,應用程式可以使用其網域特定的 URI 作為 「pack:」 URI 的授權元件。 這類 URI 只能在指定應用程式的內容中解析。 稍後會在「PackageStore」中說明用於這類應用程式特定 URI 的程式設計技術。

定址封裝內的元件

套件中的元件是使用 「pack:」 URI 定址。 解決元件之 「pack:」 URI 的結構如下:pack:// < authority >< 路徑>

範例:定址元件

pack://HTTP%3a,www.site.com,windows,p1.xps/fonts/arial.ttf會將 http://www.site.com/windows/p1.xps名為 /fonts/arial.ttf的元件定址為 。

授權單位元件會保存整個封裝的編碼 URI;路徑元件會保存該套件中的元件名稱。 元件名稱符合針對路徑絕對 URI 元件所定義的文法, ([2],第 3.3 節) ,但有一些額外的限制 ([1],第 2.1.1.1 節) 。

範例:元件名稱

/documents/doc1.xaml

/pages/page4.xaml

/fonts/arial.ttf

元件名稱不區分大小寫的 ASCII 字串。 封裝中的所有元件都有唯一的名稱。

使用片段識別碼來參考元件

某些使用開放式封裝慣例的應用程式可以使用具有格式特定片段識別碼之套件單位的非「套件:」URI 來參考元件。

範例:使用非「pack:」 URI 來參考元件

URI http://www.site.com/windows/p1.xps\#15 可用來參考代表 p1.xps 檔中第 15 頁的元件, ([3],第 9.2.2 節和 9.2.3 節) 。

雖然它有效,但對於某些案例而言,讓非「套件:」URI 參考元件很有用,但這類 URI 無法當做基底 URI 來解析元件內容中的相對參考。

參考元件內的專案

元件是套件內最細微的可定址資源。 不過,應用程式可能需要參考元件內容中的專案。 針對特定內容類型,專案可以透過片段識別碼 ([2],第 3.5 節) 來參考。 開放式封裝慣例不會指定片段識別碼。 使用片段識別碼的應用程式會負責正確處理它們。

範例:參考元件內的專案

pack://HTTP%3a,www.site.com,windows,p1.xps/pages/page1.xaml#//[@Id=「A012」]是指名為/pages/page1.xaml之元件內容內的一組 XML 節點,且識別碼屬性值為A012

巢狀套件

封裝可以是巢狀的。 套件中的元件可以保存任何類型的內容,包括整個套件。 巢狀套件的元件可由 「pack:」 URI 定址,其中具有授權元件,指出保存此巢狀套件的元件 ([1],附錄 D.3) 。

範例:定址巢狀封裝中的元件

位於 http://www.site.com/package 的套件包含名為/nested-package的元件

,

由 「pack:」 URI pack://HTTP%3a,www.site.com,package/nested-package定址。

上述 URI 所定址的部分包含套件單位,其中包含名為 /p1.xaml的元件。

巢狀封裝中這個部分的位址如下所示:

pack://pack%3a,HTTP:%253a%2c%2cwww.site.com%2cpackage,nested-package/p1.xaml

元件內容中的參考

具有特定內容類型的元件,例如 XML,可以包含 URI 參考。 URI 參考可以是 URI 或相對參考。 URI 參考可以透過 Unicode 字串在內容中表示。 解析這類 URI 參考的應用程式必須將字串轉換成 URI 表單, ([4],第 3.1 節) 。

相對參考是相對於包含參考之內容的基底 URI 所表示的 URI。 元件內容的預設基底 URI 是定址元件的 「pack:」 URI。

範例:基底 URI

所定址 http://www.site.com/windows/p1.xps 套件中名為/pages/page1.xaml之元件的基底 URI 如下所示:

pack://HTTP%3a,www.site.com,windows,p1.xps/pages/page1.xaml

如果需要替代基底 URI,才能解析元件內容專案中的相對參考,應用程式必須明確指定替代專案。 特定內容類型會公開指定替代基底 URI 的特定方式。 例如,XML 使用xml:base屬性、HTML 會使用< 基底 >元素,而開放式封裝慣例則使用Relationship元素的TargetMode屬性。

使用元件的 「pack:」 URI 做為相對參考的基底 URI,可確保參考的資源會是相同套件 ([2], 區段 5.2) 中的元件,除非相對參考位於很少使用的網路路徑形式 (,也就是以 「//」 ) 開頭的相對參考。

範例:解析相對參考

相對參考 。。/../page2.xaml 在定址為 pack://HTTP%3a,,www.site.com,windows,p1.xps/pages/page1.xaml 已解析為 pack://HTTP%3a,,www.site.com,windows,p1.xps/page2.xaml,定址為 /page2.xaml的部分。

套件產生者可以使用元件名稱作為相對參考的有效形式。 不過,當使用元件名稱做為相對參考時,產生者應該考慮是否可以將參考的元件同時定址為套件外部的擷取資源。 從封裝擷取元件之後,作為相對參考使用的元件名稱可能無法如預期般解析。 元件名稱所指定的部分名稱強制前置斜線,表示這類相對參考是從目前授權單位的根目錄解析。

範例:定址擷取的資源

在名為 /doc1/pages/page1.xaml的元件內容中,相對參考 /page2.xaml 會處理名為 /page2.xaml的元件,而相對參考 ./page3.xaml 會處理名為 /doc1/pages/page3.xaml 的元件。

元件 /doc1/pages/page1.xaml/doc1/pages/page3.xaml/part2.xaml 從套件擷取至名為 file:///c:/mydocs/doc1/pages/page1.xamlfile:///c:/mydocs/doc1/pages/page3.xamlfile:///c:/mydocs/page2.xaml (分別) ,相對參考 ./page3.xaml 會處理 預期檔案 file:///c:/mydocs/doc1/pages/page3.xaml;不過,相對參考 /page2.xaml 現在會處理名為 file:///page2.xaml的檔案。

關聯性中的相對參考

開放式封裝慣例會將套件中的來源和目標群組件之間的 連線定義為關聯 性 ([1],第 1.3 節) 。

關聯性會根據其來源進行分組和儲存。 關聯性元件會保存源自于相同來源元件的關聯性。 每個關聯性都是由這個關聯性元件內容中的 XML 元素所描述。 關聯性元件與這個來源元件 (唯一關聯,反之亦然,) 使用關聯性元件的已定義命名慣例。

每個 Relationship 元素中所指定 URI 的預設基底 URI 是來源元件 ([1]的 「pack:」 URI,第 1.3.5 節) 。 Relationship元素的TargetMode屬性工作表示指定關聯性的基底 URI。

範例:Relationship 元素

關聯性元件中的 專案,定義從名稱為 /pages/page1.xaml 的來源元件到相同套件內的目標群組件 /fonts/arial.ttf 的關聯性,如下所示:

<關聯性類型=「 https://schemas.microsoft.com/xps/2005/06/restricted-font" ;

TargetMode=「Internal」 Id=「A123」 Target=「./fonts/arial.ttf「/>

TargetMode屬性的內部值表示Relationship元素的基底 URI 是關聯性元件內容的預設,而且與關聯性來源元件的 「pack:」 URI 相同。 在上述範例中, Relationship 元素的基底 URI 是 /pages/page1.xaml 元件的 「pack:」 URI。

關聯性也可以以相對於整個封裝位置的外部資源為目標。

範例:與外部目標的關聯性

若為位於 file:///c:/office12/sample.docx的封裝,則為 XML 元素

<關聯識別碼=「rId9」

Type=「 https://schemas.microsoft.com/office/2006/relationships/image" ;

Target=「Icon.JPG」 TargetMode=「External」/>

定義以檔案 為目標的關聯性 file:///c:/office12/icon.jpg

TargetMode屬性的外部值會指定關聯性必須以封裝外部的資源為目標。 如果 Target 屬性保存相對參考,則需要基底 URI。 這個關聯性專案的基底 URI 必須是整個封裝的 URI。

委派關聯性的參考

某些封裝格式可能會避免在內容中使用 URI 參考,並將參考委派給關聯性。 此委派技術是以在每個Relationship元素上使用唯一識別碼值為基礎,將部分內容中的相對參考對應至對應的關聯性。

範例:將部分內容中的相對參考對應至關聯性

位於 file:///c:/office12/sample.docx 的套件具有名為 /word/document.xml 的元件,其保留

< a:blip relEmbed=「rId6」 relLink=「」 w=「0」 h=「0」/ >.

附加至此元件的關聯性部分會保留 元素

<關聯識別碼=「rId6」

Type=「 https://schemas.microsoft.com/office/2006/relationships/image" ;

TargetMode=「Internal」 Target=「media/image1.jpeg」/ >

這會將 元素連結至名為 /word/media/image1.jpeg的元件。

這種方法的優點是應用程式可以識別和維護套件內的所有參考,而不需要查看元件中的內容。

不過,如果將參考委派給關聯性,擷取至鬆散檔案的封裝元件可能無法正常運作。 若要讓關聯性目標在擷取之後運作,取用的應用程式將需要有關關聯性的特殊知識、命名關聯性元件的開放式封裝慣例,以及關聯性檔案的基底 URI 定義。

「pack:」 URI 的程式設計支援

產生和/或取用套件的應用程式將會使用套件和元件位址,並解析元件內容中的相對參考。 .NET Framework 3.0 提供 Microsoft 所提供的新一代 Managed API 集合,包含支援開放式封裝慣例定址模型的類別。 這些類別可讓應用程式撰寫和剖析參考,以及取得套件資源。 PackUriHelper類別可用來協助處理 「pack:」 URI。 PackWebRequest類別可用來取得使用 「pack:」 URI 定址的資源。

本節說明這些服務在撰寫、剖析和解析參考時所執行的函式。

讓套件服務可供使用

必須安裝 .NET Framework 3.0 版 (或更新版本的) ,才能使用封裝服務類別。 您可以在 System.IO.Packaging 命名空間中找到類別。

針對涉及 「pack:」 URI 的作業使用 System.Uri 之前,必須先為應用程式域註冊 「pack:」 URI 配置。 註冊 「pack:」 URI 配置最簡單的方式是呼叫 PackUriHelper 類別的任何方法。 您也可以使用 UriParser.Register 方法來註冊配置,而不呼叫協助程式類別,如下列範例所示。 不過,使用此方法需要安全性許可權。

範例:註冊 「pack:」 URI 配置

//To register the "pack:" URI scheme without calling PackUriHelper

UriParser.Register(new GenericUriParser
   (GenericUriParserOptions.GenericAuthority),
      "pack", -1);

取得目標資源的 「pack:」 URI

取用封裝時,一次可以取得整個封裝或一個元件做為 物件。 不論是哪一種情況, PackUriHelper.Create 方法都可以用來建立套件或元件資源的 「pack:」 URI。 這個 「pack:」 URI 接著會傳遞至 PackWebRequest 方法,以取得資源。 下一節將更詳細地討論PackWebRequest:「使用 PackWebRequest 取得套件資源」。

下列步驟會詳細說明 PackUriHelperPackWebRequest 類別如何用來支援套件耗用量的常見範例。 如果已知套件 URI 和元件 URI,應用程式可以:

  1. 使用 PackUriHelper從套件 URI 和元件 URI 撰寫 「pack:」 URI。
  2. 呼叫 PackWebRequest以取得位資料流程。
  3. 載入元件的內容並剖析以取得相對參考。
  4. 針對元件基底 URI 解析這些相對參考, (步驟 1) 中撰寫的 「pack:」 URI。
  5. 使用 System.Uri 解析相對參考,並使用 PackWebRequest 取得指定的資源。

建立所需套件的 「pack:」 URI

您可以使用 PackUriHelper.Create 方法建立封裝的 「pack:」 URI。

範例:PackUriHelper.Create

//Given the URI for a package
Uri packageUri = new Uri("http://www.newsdocs.com
               /local/today.container");

//Use the Create method to create a "pack:" URI from a non-"pack:" URI
Uri packUri = PackUriHelper.Create(packageUri);

//The resulting packUri value is
//"pack://http%3a,,www.newsdocs.com,local,today.container/"

建立的 「pack:」 URI 會傳遞至 PackWebRequest ,以取得套件資源。

建立所需元件的 「pack:」 URI

您可以使用 PackUriHelper.Create 方法來建立元件的 「pack:」 URI。

範例:PackUriHelper.Create

//Given the URI for package 
Uri packageUri = new Uri("http://www.newsdocs.com
               /local/today.container");

//Given the URI for a part
Uri partUri = new Uri("/sports.xml", UriKind.Relative);

//Use the PackUriHelper.Create method to create a "pack:" URI

Uri packUri = PackUriHelper.Create (packageUri, partUri);

//The resulting packUri value is
//"pack://http%3a,,www.newsdocs.com,local,today.container/sports.xml"

建立的 「pack:」 URI 會傳遞至 PackWebRequest ,以取得元件資源。

解析相對參考

處理元件的內容時,可能會發現參考其他元件或資源的相對參考。 解析這些參考是取得參考資源的第一個步驟。

元件內容中的相對參考會根據元件的基底 URI 解析為目標群組件的 「pack:」 URI。 目標群組件的 「pack:」 URI 會傳遞至 PackWebRequest ,以便從套件取得元件資源。 衍生自目標群組件 「pack:」 URI 的目標群組件名稱,也可以用來取得目標群組件,方法是將元件名稱傳遞至 Package.GetPart 方法。

解析目標群組件的相對參考時,解析可以採取數個路徑,視開始可用的資訊而定,以及套件是開啟 (還是可以開啟) 。 下列兩個路徑如下:

  • 從頭開始:

    1. 已知包含參考之部分的 「pack:」 URI。
    2. 套件未開啟。
    //Given the "pack:" URI for the part "/files/fixeddoc.xaml"
    //packUri =
    // "pack://http%3a,,www.newsdocs.com,local,today.container
    // /files/fixeddoc.xaml"
    
    //The part "/files/fixeddoc.xaml" contains 
    //the relative reference "../images/1.jpg"
    
    Uri relativeReference = new Uri("../images/1.jpg", 
                      UriKind.Relative);
    
    //Use System.Uri to directly obtain the absolute target URI
    
    Uri targetPackUri = new Uri(packUri, relativeReference);
    
    //The value of the resulting targetPackUri is 
    //"pack://http%3a,,www.newsdocs.com,local,today.container
    // /images/1.jpg"
    
    //Now another PackWebRequest can be made using 
    //this targetPackUri value.
    
  • 從頭開始:

    1. 已知包含參考的元件名稱。
    2. 套件已開啟。
    //Given "package" as the current instance of the Package class.
    //Given the relative reference = "../../images/1.jpg"
    
    Uri relativeReference = new Uri("../../images/1.jpg", 
                      UriKind.Relative);
    
    //Given the URI of the part that contains the relative reference
    
    Uri partUri = new Uri("/files/fixeddoc.xaml");
    
    //Use PackUriHelper.ResolvePartUri to obtain the resolved part URI 
    //of the target based on the part URI above and the relative 
    //reference in that part
    
    Uri targetPartUri = PackUriHelper.ResolvePartUri
                   (partUri, relativeReference);
    
    //The resulting targetPartUri value is "fixeddoc.xaml"
    //Now use the package.GetPart method to obtain the target part
    
    PackagePart packagePart = package.GetPart(targetPartUri);
    

提供元件名稱給封裝類別

封裝開啟之後, Package 類別就很適合用來將元件新增至套件、取得元件,以及刪除元件。 Package類別的方法,例如Package.AddPartPackage.DeletePartPackage.GetPart,會採用一部分 URI 做為參數。 PackUriHelper.CreatePartUri方法可用來從與封裝基底 URI 相對的參考建立有效的元件名稱。

範例:PackUriHelper.CreatePartUri

//Given a URI

Uri partUri = PackUriHelper.CreatePartUri 
            (new Uri "files/a.xaml",UriKind.Relative))

//The URI will be checked for validity, and a leading slash
//will be added. The resulting partUri value is "/files/a.xaml"

產生相對參考的服務

撰寫應用程式可能需要衍生相對參考,當放在來源元件的內容中時,指向目標群組件。 GetRelativeUri方法會提供此用途。

範例:GetRelativeUri 範例

//Given the URI of the source part

Uri sourcePartUri = new Uri("/tiles/pages/a.xaml", UriKind.Relative);

//Given the URI of the target part

Uri targetPartUri = new Uri("/images/event1/1.jpg", UriKind.Relative);

//Use PackUriHelper.GetRelativeUri to generate the relative reference
//that will be placed in the content of the source part.

Uri relativeReference = PackUriHelper.GetRelativeUri
               (sourcePartUri, targetPartUri);

//The resulting relativeReference value is "../../images/event1/1.jpg"

使用 PackWebRequest 取得套件資源

應用程式可以使用 PackWebRequest取得套件和元件資源,這是衍生自 System.Net.WebRequest 的類別。 PackWebRequest 會 傳回由指定 「pack:」 URI 定址的資源。

一般而言,起始 「pack:」 URI 的 PackWebRequest 包含下列步驟:

  1. 已核取 「pack:」 URI 文法。
  2. 授權單位元件會從 「pack:」 URI 擷取,並檢查它是否遵循絕對 URI 的文法。
  3. 如果 「pack:」 URI 的路徑元件是空的:
  • 系統會為授權元件取得封裝資料流程,並傳回給呼叫端。

    否則,如果路徑元件不是空的:

    1. 針對授權單位元件所識別的資源,會取得開啟套件。 根據 CachePolicy 集合, PackWebRequest 會從 PackageStore取得開啟的套件,或為套件資源建立內部 WebRequest ,並從傳回的封裝資料流程開啟封裝。
    2. 元件是使用 「pack:」 URI 的路徑元件做為元件名稱來取得。
    3. 取得元件資料流程並傳回給呼叫端。

PackWebResponse.GetStream 會傳回位的資料流程,代表整個 封裝 (封裝資料流程) 或封裝中的單一元件, (元件資料流程) 。

不同于大部分的 WebResponse 資料流程,可以使用 Stream.Seek來搜尋套件資料流程。 封裝資料流程可用來建立封裝物件。

透過 「HTTP:」 通訊協定使用套件資源作業時, PackWebRequest 支援 漸進式載入 元件:也就是說,能夠以任意順序取得元件資源,而不需要在元件資料之前載入封裝中的所有資料。

PackWebRequest 僅提供資源耗用量的設備。 它無法用來張貼或傳送資料至伺服器。

PackWebRequest 目前不支援非同步作業 (,例如 BeginGetResponse) , PackWebRequest 也不支援稍早所述的巢狀套件 () 。

The PackageStore

載入包含許多其他元件參考的套件時,可以使用 PackageStore來改善資源要求的回應時間,並降低網路流量。 PackageStore是開啟封裝之參考的應用程式本機字典。 在 PackageStore中註冊的每個套件都是由金鑰 URI 值來識別。

PackageStore可讓PackWebRequest視需要從套件取得資源,而不需要每次該套件需要另一個資源時提出伺服器要求。

PackageStore不會因為呼叫 PackWebRequest而自動變更,它必須明確修改。 有兩個公用方法可用來新增或移除 PackageStore中開啟套件的參考: Package.AddPackagePackage.RemovePackage

在 PackWebRequest上設定的預設快取原則 (CacheIfAvailable) 會導致類別嘗試使用PackageStore取得套件。 在取得資源時,可以強制PackWebRequest忽略PackageStore的內容,方法是將快取原則設定為BypassCache,如下一節「快取原則」所述。

根據預設快取原則取得套件或元件的位時, PackWebRequest 會先檢查 PackageStore ,以查看是否有一個與 「pack:」 URI 授權元件相等的金鑰註冊的套件。 如果 PackageStore 未包含金鑰的套件, PackWebRequest 會建立內部 WebRequest ,以使用 「pack:」 URI 的授權元件下載資源。

快取原則

快取原則 會定義用來判斷是否可以使用資源的快取複本來填入資源要求的規則。

使用 PackWebRequest時,有兩個可以明確設定的快取原則層級。 您可以為 PackWebRequest 本身設定快取原則,以控制 與 PackageStore的互動。 此外,也可以為內部 WebRequest所控制的快取設定快取原則。 您可以使用PackWebRequest.GetInternalRequest () 來存取內部WebRequest

如果PackWebRequest.CachePolicy設定為CacheOnly,內部WebRequest上設定的快取原則將不會有任何作用,導致套件資源從PackageStore取得。

PackWebRequest.CachePolicy 支援原則子集,如下所示,因為 PackageStore的特定功能。

表 1. PackWebRequest.CachePolicy 原則

CachePolicy Description
BypassCache 忽略具有相符 URI 的 PackageStore 專案。
CacheOnly 只考慮 PackageStore 專案 (永遠不會建立 WebRequest 來查詢伺服器是否有資料) 。
CacheIfAvailable 檢查 PackageStore,並在找到套件時使用任何套件;否則,請對套件 URI 所指示的資源提出網路要求, (「pack:」 URI 的內部 URI) 。 此為預設值。

針對 PackWebRequest,設定所有其他 CachePolicy 值會導致 WebException

漸進式載入

當透過 「HTTP:」 通訊協定存取套件時,PackWebRequest可以漸進式載入套件元件。 漸進式載入可讓應用程式在本機使用整個套件之前存取元件資源。 PackWebRequest的漸進式載入功能是自動的:呼叫端應用程式會體驗改善的效能,而不需要介入。

漸進式載入是以對資源發出「位元組範圍要求」為基礎,如 「HTTP:」 1.1 通訊協定中所定義。 用來以實體形式儲存套件的 ZIP 檔案格式,因此這項機制的優點是 ZIP 封存格式會將重要資訊保留在檔案實體結尾的「中央目錄」中。

使用 PackWebRequest要求整個套件之後,服務會開始傳回呼叫端可以搜尋的資料流程。 當 套件在 PackWebRequest提供的資料流程上開啟時,呼叫端可以比使用 「HTTP:」 通訊協定進行直接要求時更快取得元件。

用於評估和分解 URI 的服務

識別封裝類別傳回的關聯性元件名稱

管理使用 Package.GetParts 方法取得的元件集合時,可以識別關聯性元件,以便將它們與其他元件分開處理。 PackUriHelper.IsRelationshipPartUri可用來識別元件是否為關聯性元件。

範例:PackUriHelper.IsRelationshipPartUri

//Given the URI for a part

Uri partUri = new Uri("/_rels/sports.rels", UriKind.Relative);

bool isRelationshipPart = PackUriHelper.IsRelationshipPartUri(PartUri);

//The resulting isRelationshipPart value is "TRUE"

其他兩個 PackUriHelper 方法可用於使用關聯性元件名稱。 PackUriHelper.GetRelationshipPartUri 會傳回指定來源元件名稱的關聯性元件名稱。 PackUriHelper.GetSourcePartUriFromRelationshipPartUri 會傳回指定關聯性元件名稱的來源元件名稱。

比較等價的 URI

在產生或取用封裝時,使用快取來儲存元件的應用程式可能需要執行對等元件名稱的檢查。 PackUriHelper.ComparePartUri方法會檢查部分名稱的等價。

範例:PackUriHelper.ComparePartUri

//Given two part names in the same package
//firstPartName = "/a.xaml"
//secondPartName = "/A.xaml"

//Use PackUriHelper.ComparePartUri to identify if the names 
//are equivalent.

Bool isSamePartName = PackUriHelper.ComparePartUri 
               (firstPartName, secondPartName);

//The resulting isSamePartName value is "TRUE"

若要判斷兩個 「pack:」 URI 的語彙相等,請使用 PackUriHelper.ComparePackUri 方法。

範例:PackUriHelper.ComparePackUri

//Given two "pack:" URIs
//firstPackUri =
// "PACK://HTTP%3A,,WWW.NEWSDOCS.COM,local,today.container
// /FILES/FIXEDDOC.XAML"
//secondPackUri = 
// "pack://http%3a,,www.newsdocs.com,local,today.container
// /files/fixeddoc.xaml"

//Use PackUriHelper.ComparePackUri to identify if the same resource 
//is targeted.

bool isSameResource = PackUriHelper.ComparePackUri 
            (firstPackUri, secondPackUri);

//The resulting isSameResource value is "TRUE"

從 「pack:」 URI 擷取元件 URI

若要從 「pack:」 URI 擷取元件套件 URI 和元件 URI,請分別使用 PackUriHelper.GetPackageUriPackUriHelper.GetPartUri方法。

範例:PackUriHelper.GetPackageUri

//Given the "pack:" URI for a package

Uri packUri = "pack://http%3a,,www.newsdocs.com,local,today.container
            /files/abc.xaml";

//Use PackUriHelper.GetPackageUri to obtain the URI of the package

Uri packageUri = new PackUriHelper.GetPackageUri(packUri);

//The resulting packageUri value is
//"http://www.newsdocs.com/local/today.container"

範例:GetPartUri 範例

//Given the "pack:" URI for a part

Uri packUri = "pack://http%3a,,www.newsdocs.com,local,today.container
         /files/abc.xaml";

//Use PackUriHelper.GetPartUri to obtain the URI of the part

Uri partUri = new PackUriHelper.GetPartUri(packUri);

//The resulting partUri value is "/files/abc.xaml"

參考資料

開放式封裝慣例

統一資源識別項 (URI):一般語法

Open XML 文件規格

(IRI) 的國際化資源識別碼