Açık Paketleme Kurallarının Adresleme Modeli
David Meltzer ve Andrey Shur
Microsoft Corporation
Haziran 2006
Aşağıdakiler cihazlar için geçerlidir:
Open Packaging Conventions
Microsoft Office 2007
Microsoft Windows Vista
Microsoft .NET Framework
Özet: Bu makalede paketlerin ve parçalarının nasıl ele alındıkları, paket bölümlerindeki göreli başvuruların nasıl çözümlendiği ve uygulamaların .NET Framework ve sınıfların yardımıyla paket adresleme modelini nasıl kullanabileceği gibi Açık Paketleme Kuralları'nda kullanılan adresleme modeline genel bir bakış sağlanır. (16 yazdırılan sayfa)
İçindekiler
Önsöz
Adresleme Modeli
"pack:" URI'leri için Programlama Desteği
Başvurular
Önsöz
Microsoft, Office 2007 ve Windows Vista'nın tasarımının bir parçası olarak Open Packaging Conventions'ı kullanıma sunmlanmıştır. Bu kurallar, içeriğin bir "pakette" nasıl düzenlenebileceğini açıklar. bazı içerik örnekleri arasında belge, medya koleksiyonu ve uygulama kitaplığı yer alır. Paketler, içeriğin tüm bileşenlerini tek bir nesnede toplar.
Sözcük işleme uygulaması, örneğin bir belgenin sayfalarını, gereken yazı tiplerini ve sayfalardaki resimleri, grafikleri ve ek açıklamaları depolamak için paketler kullanabilir. Belge görüntüleme veya yönetim uygulaması bir paketteki içeriğin yalnızca bir bölümünü görüntüleyebilir. Uygulamalar, bir yazıcıya sabit düzende içerik ve kaynak göndermek için XML Kağıt Belirtimi (XPS) gibi paket tabanlı bir biçim kullanabilir.
Bu makalede, paketlerin ve parçalarının nasıl ele alındıkları ve paket bölümlerindeki göreli başvuruların nasıl çözümlendiği de dahil olmak üzere Açık Paketleme Kuralları'nda kullanılan adresleme modeline genel bir bakış sağlanır. Bu makalede ayrıca uygulamaların .NET Framework ve .NET Framework 3.0 sınıflarının yardımıyla paket adresleme modelini nasıl kullanabileceği açıklanır. Bu makale öncelikle paketleri işleyecek, üretecek veya kullanacak uygulamaların geliştiricileri için yazılmıştır.
Paket adresleme modelini uygulamak için gereken tam normatif bilgiler için Open Packaging Conventions belirtimine bakın. .NET Framework 3.0 ve .NET SDK'ları, ele alınan sınıflar ve yöntemler hakkında daha fazla bilgi sağlar.
Bu genel bakışta sunulan malzeme, URI belirtimi hakkında temel bir bilgi olduğunu varsayar. RFC 3986'ya göre aşağıdaki terimler kullanılır: URI, URI başvurusu, şema bileşeni, yetkili bileşeni, yol bileşeni, yol mutlak ve göreli başvuru. URI terimi her zaman bir URI'nin mutlak biçimini belirtir; şema bileşeni mevcuttur ve diğer tüm bileşenler şemaya özgü dil bilgisi ile eşleşmektedir. Burada kullanıldığı gibi adreslenebilir terimi, bir kaynağı tanımlayan bir URI'nin mevcut olduğunu gösterir.
Adresleme Modeli
Açık Paketleme Kuralları, bir paketin içeriğini ve kaynaklarını düzenlemek için bir mantıksal model tanımlar ve zip, XML ve diğer açık kullanılabilir teknolojilere dayalı olarak bu mantıksal modelden fiziksel bir gösterime eşleme sağlar.
Açık Paketleme Kuralları tarafından açıklanan mantıksal paketleme modeli , bir parça koleksiyonunu barındıran bir paket soyutlaması tanımlar. Parçaların birbiriyle ilişkisi olabilir ve paketin parça ilişkileri olabilir. Paketleme modeli, bir paketteki parçaların nasıl adlandırıldığını, başvurıldığını ve ilişkili olduğunu belirtir. Kurallar tarafından tanımlanan adresleme modeli , bir paketteki parça kaynaklarına başvurabilmenin ve alabilmenin temelini oluşturur.
Adreslenebilir Paket Kaynakları
Bir bütün olarak paket örneği, paket örneğinde tutulan her parça gibi adreslenebilir bir kaynaktır.
Bir Paketi Birim Olarak Ele Alma
Uygulamalar, bir paketi birim olarak ele almak ve paketin tamamını oluşturan bit akışını elde etmek için herhangi bir şemayla (örneğin, "http:", "ftp:" vb.) bir URI kullanabilir.
Uygulamalar, Open Packaging Conventions tarafından tanımlanan "pack:" URI şemasını kullanarak da bir paketi ele alabilir. Bu düzen, paketi tanımlayan tam URI'nin kodlanmış bir biçimdeki "pack:" URI'sinin yetkili bileşeninde tutulduğunu belirtir.
Örnek: Paket Adresleme
Paket kaynağı, aşağıdaki örneklerde "http:" ve "pack:" URI'leri (sırasıyla) tarafından ele alınır:
pack://http%3a,,www.site.com,windows,p1.xps/
Alınan paket kaynağının MIME türü paketin dosya biçimini gösterir; örneğin, XPS Belge biçimi (.xps), Office Open XML biçimi (.docx) veya Açık Paketleme Kuralları'na uyan başka bir biçim olabilir.
Çeşitli nedenlerle (performansı geliştirme gibi), uygulamalar bir "pack:" URI'sinin yetkili bileşeni olarak etki alanlarına özgü bir URI kullanabilir. Böyle bir URI yalnızca belirli bir uygulama bağlamında çözümlenebilir. Bu tür uygulamaya özgü URI'ler için kullanılan programlama tekniği daha sonra "PackageStore" bölümünde açıklanmıştır.
Paket İçindeki Bölümleri Adresleme
Paketteki bölümler "pack:" URI'leri kullanılarak ele alınır. Bir bölümü ele alan "pack:" URI'sinin yapısı şu şekildedir: pack://< authority><yolu>
Örnek: Bölümleri Adresleme
pack://http%3a,,www.site.com,windows,p1.xps/fonts/arial.ttf , tarafından http://www.site.com/windows/p1.xpsele alınan pakette /fonts/arial.ttf adlı bölümü adresler.
Yetkili bileşeni paketin tamamının kodlanmış URI'sini barındırıyor; yol bileşeni, o paketteki bölümün adını tutar. Bölüm adları, bazı ek kısıtlamalarla ([1], bölüm 2.1.1.1) yol mutlak URI bileşeni ([2], bölüm 3.3) için tanımlanan dil bilgisi ile uyumlu.
Örnek: Parça Adları
/documents/doc1.xaml
/pages/page4.xaml
/fonts/arial.ttf
Bölüm adları büyük/küçük harfe duyarlı olmayan ASCII dizeleridir. Paketteki tüm bölümlerin benzersiz adları vardır.
Parçalara Başvurmak için Parça Tanımlayıcılarını Kullanma
Open Packaging Conventions kullanan bazı uygulamalar, biçime özgü parça tanımlayıcılarıyla paket biriminin "paket:" olmayan bir URI'sini kullanarak bir parçaya başvurabilir.
Örnek: Bir Parçaya Başvurmak için Non-"pack:" URI'sini kullanma
URI http://www.site.com/windows/p1.xps\#15 , p1.xps belgesinde ([3], 9.2.2 ve 9.2.3 bölümleri) 15. sayfayı temsil eden bölüme başvurmak için kullanılır.
Geçerli olsa da ve bazı senaryolar için "pack:" olmayan URI'lere sahip olmak yararlı olsa da bölümlere başvurur; bu tür URI'ler parça içeriğindeki göreli başvuruları çözümlemek için temel URI'ler olarak kullanılamaz.
Parçalar İçindeki Girdilere Başvurma
Bir parça, bir paket içindeki en ayrıntılı adreslenebilir kaynaktır. Ancak, uygulamaların bir bölümün içeriğindeki girdilere başvurması gerekebilir. Belirli içerik türleri için girişlere parça tanımlayıcıları ([2], bölüm 3.5) yoluyla başvurulabilir. Open Packaging Conventions, parça tanımlayıcılarını belirtmez. Parça tanımlayıcıları kullanan uygulamalar bunları düzgün bir şekilde işlemekle sorumludur.
Örnek: Bölümler İçindeki Girdilere Başvurma
pack://http%3a,,www.site.com,windows,p1.xps/pages/page1.xaml#//[@Id="A012"], /pages/page1.xaml adlı bölümün içeriğinde yer alan ve A012Kimlik özniteliği değerine sahip bir XML düğümü kümesini ifade eder.
İç İçe Paketler
Paketler iç içe olabilir. Paketteki bir parça, paketin tamamı dahil olmak üzere herhangi bir türde içeriği barındırabilir. İç içe bir paketin bölümleri bir "pack:" URI'siyle ele alınabilir ve bu iç içe paketi barındıran bölümü belirten bir yetkili bileşeni ([1], Ek D.3).
Örnek: İç İçe Paketlerdeki Bölümleri Adresleme
konumunda http://www.site.com/package bulunan bir paket /nested-package adlı bir parça içeriyor
,
"pack:" URI paketi tarafından adreslenir://http%3a,,www.site.com,package/nested-package.
Önceki URI tarafından ele alınan bölüm, /p1.xaml adlı bir bölümü içeren bir paket birimi içerir.
bu bölümün iç içe paketteki adresi aşağıdaki gibidir:
pack://pack%3a,,http:%253a%2c%2cwww.site.com%2cpackage,nested-package/p1.xaml.
Bölüm İçeriğindeki Başvurular
XML gibi belirli içerik türlerine sahip bölümler URI başvuruları içerebilir. URI başvuruları URI'ler veya göreli başvurular olabilir. URI başvuruları içerikte Unicode dizeleriyle gösterilebilir. Bu tür URI başvurularını çözen uygulamaların dizeleri bir URI formuna dönüştürmesi gerekir ([4], bölüm 3.1).
Göreli başvuru, başvuruyu içeren içeriğin temel URI'sine göre ifade edilen bir URI'dir. Bölüm içeriği için varsayılan temel URI, bölümü ele alan "pack:" URI'dir.
Örnek: Temel URI
tarafından ele http://www.site.com/windows/p1.xps alınan bir paketteki /pages/page1.xaml adlı bölümün temel URI'si aşağıdaki gibidir:
pack://http%3a,,www.site.com,windows,p1.xps/pages/page1.xaml.
Parça içeriğinin girdilerindeki göreli başvuruları çözümlemek için alternatif bir temel URI gerekiyorsa, uygulamanın alternatifini açıkça belirtmesi gerekir. Belirli içerik türleri, alternatif temel URI'yi belirtmenin belirli yollarını gösterir. Örneğin, XML xml:base özniteliğini, HTML temel> öğesini,< Open Packaging Conventions ise İlişki öğeleri için TargetMode özniteliğini kullanır.
Göreli başvuru için temel URI olarak bir parçanın "pack:" URI'sinin kullanılması, göreli başvurunun nadiren kullanılan ağ yolu formunda (yani "//" ile başlayan göreli bir başvuru) olmadığı sürece, başvuruda bulunılan kaynağın aynı pakette ([2], bölüm 5.2) bir parçası olacağını garanti eder.
Örnek: Göreli Başvuru çözümleme
Göreli başvuru .. /.. pack://http%3a,,www.site.com,windows,p1.xps/pages/page1.xaml olarak adreslenen bölümdeki /page2.xaml, /page2.xaml adlı bölümü ele alan pack://http%3a,,www.site.com,windows,p1.xps/page2.xaml olarak çözümlenir.
Paket üreticileri, göreli başvuruların geçerli bir biçimi olarak parça adlarını kullanabilir. Ancak, göreli başvurular olarak parça adlarını kullanırken, üreticiler başvuruda bulunılan parçaların paketin dışında ayıklanan kaynaklar olarak da ele alınıp alınamayacağını göz önünde bulundurmalıdır. Parçalar bir paketten ayıklandıktan sonra göreli başvuru olarak kullanılan parça adları beklendiği gibi çözümlenmeyebilir. Bölüm adı dil bilgisi ile belirtilen bölüm adları için zorunlu baştaki eğik çizgi, bu tür göreli başvuruların geçerli yetkilinin kökünden çözümlendiğini gösterir.
Örnek: Ayıklanan Kaynakları Ele Alma
/doc1/pages/page1.xaml adlı bir bölümün içeriğinde göreli başvuru /page2.xaml , /page2.xaml adlı bölümü ve göreli başvuru ./page3.xamlise /doc1/pages/page3.xaml adlı bölümü giderir.
Parçalar /doc1/pages/page1.xaml, /doc1/pages/page3.xaml ve /part2.xaml paketten file:///c:/mydocs/doc1/pages/page1.xaml, file:///c:/mydocs/doc1/pages/page3.xaml ve file:///c:/mydocs/page2.xaml adlı dosyalara ayıklandıktan sonra (sırasıyla), göreli başvuru ./page3.xaml dosya file:///c:/mydocs/doc1/pages/page3.xaml giderir; ancak göreli başvuru /page2.xaml artık file:///page2.xaml adlı dosyayı ele alır.
İlişkilerde Göreli Başvurular
Açık Paketleme Kuralları, bir paketteki kaynak ve hedef parçalar arasındaki bağlantıları ilişki olarak tanımlar ([1], bölüm 1.3).
İlişkiler kaynaklarına göre gruplandırılır ve depolanır. İlişkiler bölümü, aynı kaynak bölümden kaynaklanan ilişkileri barındırıyor. Her ilişki, bu ilişkiler bölümünün içeriğindeki bir XML öğesi tarafından açıklanır. İlişkiler bölümü, ilişkiler bölümü için tanımlı bir adlandırma kuralı kullanılarak bu kaynak bölümle benzersiz olarak ilişkilendirilir (ve tam tersi).
Her İlişki öğesinde belirtilen URI'ler için varsayılan temel URI, kaynak bölümün ([1], bölüm 1.3.5) "pack:" URI'sine sahiptir. bir İlişki öğesinin TargetMode özniteliği, belirtilen ilişkinin temel URI'sini gösterir.
Örnek: İlişki Öğesi
aynı paket içindeki /pages/page1.xaml adlı kaynak bölümden /fonts/arial.ttf hedef bölümüne ilişki tanımlayan ilişkiler bölümündeki öğesi aşağıdaki gibi görünebilir:
<İlişki Türü="https://schemas.microsoft.com/xps/2005/06/restricted-font"
TargetMode="Internal" Id="A123" Target=".. /fonts/arial.ttf"/>
TargetMode özniteliğinin İç değeri, İlişki öğesinin temel URI'sinin ilişkiler bölümü içeriği için varsayılan değer olduğunu ve ilişkiler kaynak bölümünün "pack:" URI'sinin aynı olduğunu gösterir. Yukarıdaki örnekte, İlişki öğesinin temel URI'si /pages/page1.xaml bölümünün "pack:" URI'sidir.
İlişkiler ayrıca tüm paketin konumuna göre dış kaynakları hedefleyebilir.
Örnek: Dış Hedefle İlişki
file:///c:/office12/sample.docxkonumunda bulunan bir paket için XML öğesi
<İlişki Kimliği="rId9"
Tür="https://schemas.microsoft.com/office/2006/relationships/image"
Target="Icon.JPG" TargetMode="External"/>
file:///c:/office12/icon.jpgdosyasını hedefleyen ilişkiyi tanımlar.
TargetMode özniteliğinin Dış değeri, ilişkinin paketin dışındaki bir kaynağı hedeflemesi gerektiğini belirtir. Target özniteliği göreli başvuru barındırıyorsa temel URI gereklidir. Bu ilişki öğesinin temel URI'sinin tüm paketin URI'si olması gerekir.
İlişkilere BaşvuruLar Için Temsilci Belirleme
Bazı paket tabanlı biçimler içerikte URI başvurularını kullanmaktan kaçınabilir ve ilişkilere başvurular atayabilir. Bu temsilci seçme tekniği, bölüm içeriğindeki göreli başvuruları ilgili ilişkilerle eşlemek için her İlişki öğesinde benzersiz kimlik değerlerinin kullanılmasını temel alır.
Örnek: Bölüm İçeriğindeki Göreli Başvuruları İlişkilerle Eşleme
file:///c:/office12/sample.docx konumunda bulunan bir paketin /word/document.xml adlı bölümü
<a:blip relEmbed="rId6" relLink="" w="0" h="0"/>.
Bu bölüme iliştirilen ilişkiler bölümü, öğesini barındırıyor
<İlişki Kimliği="rId6"
Tür="https://schemas.microsoft.com/office/2006/relationships/image"
TargetMode="Internal" Target="media/image1.jpeg"/>.
Bu, öğeyi /word/media/image1.jpeg adlı bölüme bağlar.
Bu yaklaşımın avantajı, bir uygulamanın parçalardaki içeriğe bakmadan bir paket içindeki tüm başvuruları tanımlayıp koruyabilmesidir.
Ancak, başvurular ilişkilere temsilci olarak atandıysa, gevşek dosyalara ayıklanan paket parçaları düzgün çalışmayabilir. İlişki hedeflerinin ayıklama sonrasında çalışması için, tüketen bir uygulama ilişkiler hakkında özel bilgi, ilişki parçalarını adlandırmak için Açık Paketleme Kuralları ve ilişki dosyaları için temel URI'lerin tanımı gerektirir.
"pack:" URI'leri için Programlama Desteği
Paket üreten ve/veya kullanan uygulamalar paket ve parça adresleriyle çalışır ve parçaların içeriğindeki göreli başvuruları çözümler. Microsoft tarafından sağlanan yeni nesil yönetilen API'ler kümesini sunan .NET Framework 3.0, Açık Paketleme Kuralları'nın adresleme modelini destekleyen sınıfları içerir. Bu sınıflar, uygulamaların başvuruları oluşturup ayrıştırmasını ve paket kaynaklarını almasını sağlar. PackUriHelper sınıfı, "pack:" URI'lerinin işlenmesini kolaylaştırmak için kullanılır. PackWebRequest sınıfı, "pack:" URI'leri kullanılarak ele alınan kaynakları almak için kullanılır.
Bu bölümde, bu hizmetlerin başvuruları oluştururken, ayrıştırırken ve çözerken gerçekleştirdiği işlevler gösterilir.
Paket Hizmetlerini Kullanılabilir Hale Getirme
Paketleme hizmetleri sınıflarını kullanmak için .NET Framework sürüm 3.0 (veya üzeri) yüklenmelidir. Sınıflar System.IO.Packaging ad alanında bulunabilir.
"Pack:" URI'lerinin dahil olduğu işlemler için System.Uri kullanmadan önce, uygulama etki alanı için "pack:" URI şemasının kaydedilmesi gerekir. "pack:" URI düzenini kaydetmenin en kolay yolu , PackUriHelper sınıfının herhangi bir yöntemini çağırmaktır. Şema, aşağıdaki örnekte gösterildiği gibi UriParser.Register yöntemi kullanılarak yardımcı sınıfı çağrılmadan da kaydedilebilir. Ancak, bu yöntemin kullanılması güvenlik izinleri gerektirir.
Örnek: "pack:" URI Şemasını Kaydetme
//To register the "pack:" URI scheme without calling PackUriHelper
UriParser.Register(new GenericUriParser
(GenericUriParserOptions.GenericAuthority),
"pack", -1);
Hedef Kaynağın "pack:" URI'sini alma
Bir paket tüketilirken, paketin tamamı veya bir kerede bir parça, bir nesne olarak elde edilebilir. Her iki durumda da PackUriHelper.Create yöntemi paketin veya parça kaynağının "pack:" URI'sini oluşturmak için kullanılabilir. Bu "pack:" URI daha sonra kaynağı almak için PackWebRequest yöntemine geçirilir. PackWebRequest , sonraki "PackWebRequest Kullanarak Paket Kaynaklarını Alma" bölümünde daha ayrıntılı olarak açıklanmıştır.
Paket kullanımını desteklemek için PackUriHelper ve PackWebRequest sınıflarının nasıl kullanılabileceğini gösteren yaygın bir örnek aşağıdaki adımlarda ayrıntılı olarak verilmiştir. Paket URI'si ve bölüm URI'sı biliniyorsa, bir uygulama şunları yapabilir:
- PackUriHelper kullanarak paket URI'sinden ve bölüm URI'sinden "pack:" URI'sini oluşturma.
- PackWebRequest'i çağırarak bit akışı alın.
- Parçanın içeriğini yükleyin ve göreli başvurular elde etmek için ayrıştırın.
- Bu göreli başvuruları parça tabanı URI'sine (1. Adımda oluşturulan "pack:" URI'sine) karşı çözümleyin.
- Göreli başvuruları çözümlemek için System.Uri kullanın ve belirtilen kaynakları almak için PackWebRequest kullanın.
İstenen Paket için "pack:" URI'sini oluşturma
Paketin "pack:" URI'sı PackUriHelper.Create yöntemi kullanılarak oluşturulabilir.
Örnek: 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/"
Paket kaynağını almak için oluşturulan "pack:" URI'sı PackWebRequest'e geçirilir.
İstenen Bölüm için "pack:" URI'sini oluşturma
Bölümün "pack:" URI'sı PackUriHelper.Create yöntemi kullanılarak oluşturulabilir.
Örnek: 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"
Oluşturulan "pack:" URI'sı, parça kaynağını almak için PackWebRequest'e geçirilir.
Göreli Başvuruları Çözümleme
Bir bölümün içeriğini işlerken, diğer bölümlere veya kaynaklara başvuran göreli başvurular bulunabilir. Bu başvuruları çözümlemek, başvuruda bulunulan kaynakları edinmenin ilk adımıdır.
Bir parçanın içeriğindeki göreli başvuru, hedef bölümün "paket:" URI'sine bir parçanın temel URI'sine karşı çözümlenir. Paketten parça kaynağını almak için hedef bölümün "pack:" URI'si PackWebRequest'e geçirilir. Hedef bölümün "pack:" URI'sinden türetilen bir hedef parçanın adı, parça adını Package.GetPart yöntemine geçirerek hedeflenen bölümü elde etmek için de kullanılabilir.
Hedef bölümlere göreli başvuruları çözümlerken, başlangıçta hangi bilgilerin kullanılabilir olduğuna ve paketin açık (veya açılabilir) olmasına bağlı olarak çözünürlüğün alabildiği çeşitli yollar vardır. Bu yollardan ikisi aşağıdaki gibidir:
Başlangıçta:
- Başvuruyu içeren bölümün "pack:" URI'sı bilinmektedir.
- Paket açık değil.
//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.
Başlangıçta:
- Başvuruyu içeren bölümün adı bilinir.
- Paket açık.
//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);
Paket Sınıfına Parça Adları Sağlama
Paket açıldıktan sonra Paket sınıfı paketlere parça eklemek, parçaları almak ve bölümleri silmek için kullanışlıdır. Package.AddPart, Package.DeletePart ve Package.GetPart gibi Package sınıfının yöntemleri parametre olarak bir parça URI'sini alır. PackUriHelper.CreatePartUri yöntemi, paketin temel URI'sine göre bir başvurudan geçerli bir parça adı oluşturmak için kullanılabilir.
Örnek: 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"
Göreli BaşvuruLar Oluşturma Hizmeti
Yazma uygulamasının, kaynak bölümün içeriğine yerleştirildiğinde hedef bölümü işaret eden göreli bir başvuru türetilmesi gerekebilir. GetRelativeUri yöntemi bu amaca hizmet eder.
Örnek: GetRelativeUri Örneği
//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 Kullanarak Paket Kaynaklarını Alma
Uygulamalar, System.Net.WebRequest'ten türetilmiş bir sınıf olan PackWebRequest'i kullanarak paket ve parça kaynaklarını alabilir. PackWebRequest , belirli bir "pack:" URI'sinde ele alınan bir kaynak döndürür.
Genel olarak, bir "pack:" URI'sine packWebRequest başlatma işlemi aşağıdaki adımlardan oluşur:
- "pack:" URI dil bilgisi denetlenir.
- Yetkili bileşeni "pack:" URI'sinden ayıklanır ve mutlak bir URI için dil bilgisini takip edip etmediği denetlenir.
- "pack:" URI'sinin yol bileşeni boşsa:
Paket akışı yetkili bileşeni için alınır ve çağırana döndürülür.
Aksi takdirde, yol bileşeni boş değilse:
- Yetkili bileşeni tarafından tanımlanan kaynak için açık paket elde edilir. CachePolicy kümesine bağlı olarak, PackWebRequestPackageStore'ndan açık bir paket alır veya paket kaynağı için bir iç WebRequest oluşturur ve döndürülen paket akışından paketi açar.
- Parça, parça adı olarak "pack:" URI'sinin yol bileşeni kullanılarak elde edilir.
- Parça akışı elde edilir ve çağırana döndürülür.
PackWebResponse.GetStream, paketin tamamını ( paket akışı) veya bir paketteki tek bir bölümü ( parça akışı) temsil eden bir bit akışı döndürür.
Çoğu WebResponse akışının aksine, Stream.Seek kullanılarak paket akışı aranabilir. Paket akışı, paket nesnesi oluşturmak için kullanılabilir.
Paket kaynağıyla bir "http:" protokolü üzerinden çalışırken , PackWebRequest parçaların aşamalı yüklenmesini destekler: yani parça kaynaklarını parça verilerine kadar paketteki tüm verileri yüklemeden rastgele bir sırada alma olanağı.
PackWebRequest yalnızca kaynak tüketimi için olanaklar sağlar. Bir sunucuya veri göndermek veya göndermek için kullanılamaz.
PackWebRequest şu anda zaman uyumsuz işlemleri ( BeginGetResponse gibi) desteklemez veya PackWebRequest iç içe paketleri desteklemez (daha önce "Paket İçindeki Bölümleri Adresleme" bölümünde açıklanmıştır).
The PackageStore
Diğer bölümlere çok sayıda başvuru içeren parçalar içeren paketleri yüklerken, PackageStore kullanılarak kaynak istekleri için yanıt süresi geliştirilebilir ve ağ trafiği azaltılabilir. PackageStore, paketleri açmaya yönelik başvurulardan oluşan bir uygulama yerel sözlüğüdür. PackageStore'na kaydedilen her paket bir anahtar URI değeriyle tanımlanır.
PackageStore, PackWebRequest'in bir paketten gerektiğinde, bu paketten her kaynak gerektiğinde sunucu isteğinde bulunmadan kaynakları almasını sağlar.
PackageStore, PackWebRequest çağrısının sonucu olarak otomatik olarak değiştirilmez; açıkça değiştirilmesi gerekir. PackageStore'nda paketleri açmak için başvuru eklemek veya kaldırmak için kullanılan iki genel yöntem vardır: Package.AddPackage ve Package.RemovePackage.
PackWebRequest üzerinde ayarlanan varsayılan önbellek ilkesi (CacheIfAvailable), sınıfın paketi almak için PackageStore'u kullanmayı denemesine neden olur. PackWebRequest, sonraki "Önbellek İlkeleri" bölümünde açıklandığı gibi önbellek ilkesini BypassCache olarak ayarlayarak kaynakları alırken PackageStore içeriğini yoksaymaya zorlanabilir.
Paket veya bölümün bitlerini varsayılan önbellek ilkesine göre alırken , PackWebRequest önce PackageStore'nda "pack:" URI'sinin yetkili bileşenine eşit bir anahtarla kaydedilmiş bir paket olup olmadığını denetler. PackageStore anahtarın paketini içermiyorsa, PackWebRequest "pack:" URI'sinin yetkili bileşenini kullanarak kaynağı indirmek için bir iç WebRequest oluşturur.
Önbellek İlkeleri
Önbellek ilkeleri , bir kaynak isteğinin kaynağın önbelleğe alınmış bir kopyası kullanılarak doldurulup doldurulamayacağını belirlemek için kullanılan kuralları tanımlar.
PackWebRequest kullanırken, açıkça ayarlanabilen iki önbellek ilkesi düzeyi vardır. PackWebRequest'in kendisi için PackageStore ile etkileşimi denetleye bir önbellek ilkesi ayarlanabilir. Ayrıca, iç WebRequest tarafından denetlenen önbellek için bir önbellek ilkesi de ayarlanabilir. İç WebRequest'ePackWebRequest tarafından, PackWebRequest.GetInternalRequest() kullanılarak erişilebilir.
İç WebRequest'te ayarlanan önbellek ilkesi , PackWebRequest.CachePolicyCacheOnly olarak ayarlanırsa ve paket kaynağının PackageStore'ndan alınmasına neden olursa hiçbir etkisi olmaz.
PackWebRequest.CachePolicy , PackageStore'nun belirli özellikleri nedeniyle aşağıda listelenen ilkelerin bir alt kümesini destekler.
Tablo 1. PackWebRequest.CachePolicy ilkeleri
CachePolicy | Description |
---|---|
BypassCache | Eşleşen bir URI'ye sahip PackageStore girdilerini yoksayın. |
CacheOnly | Yalnızca PackageStore girdilerini göz önünde bulundurun (hiçbir zaman sunucuyu veri sorgulamak için bir WebRequest oluşturmayın). |
CacheIfAvailable | PackageStore'unu inceleyin ve varsa orada herhangi bir paket kullanın; aksi takdirde, paket URI'sinin ("pack:" URI'sinin iç URI'si) tarafından belirtilen kaynağa bir ağ isteğinde bulunun. Bu varsayılan seçenektir. |
PackWebRequest için diğer tüm CachePolicy değerlerinin ayarlanması bir WebException ile sonuçlanıyor.
Aşamalı Yükleme
Pakete "http:" protokolü üzerinden erişildiğinde PackWebRequest bir paket bölümünü aşamalı olarak yükleyebilir. Aşamalı yükleme, uygulamaların paketin tamamı yerel olarak kullanılabilir duruma gelmeden önce parça kaynaklarına erişmesini sağlar. PackWebRequest'in aşamalı yükleme özelliği otomatiktir: çağıran uygulama, araya girmeden geliştirilmiş performansı deneyimler.
Aşamalı yükleme, "http:" 1.1 protokolünde tanımlandığı gibi kaynaklar için "bayt aralığı istekleri" yapmayı temel alır. Zip arşiv biçimi önemli bilgileri dosyanın fiziksel ucundaki bir "merkezi dizinde" tuttuğundan, paketleri fiziksel biçimde depolamak için kullanılan ZIP dosya biçimi bu mekanizmadan yararlanır.
PackWebRequest kullanarak paketin tamamını talep ettikten sonra hizmet, çağıranın arayabileceği bir akış döndürmeye başlar. PackWebRequest tarafından sağlanan akışta bir paket açıldığında çağıran, "http:" protokolü gibi doğrudan isteklerde bulunurken daha hızlı bir şekilde parçaları alabilir.
URI'leri Değerlendirme ve Ayrıştırma Hizmetleri
Paket Sınıfı Tarafından Döndürülen İlişki Parçası Adlarını Tanımlama
Package.GetParts yöntemi kullanılarak elde edilen bir parça koleksiyonunu yönetirken, ilişki parçaları tanımlanabilir ve böylece diğer parçalardan ayrı olarak işlenebilir. PackUriHelper.IsRelationshipPartUri, bir parçanın ilişki parçası olup olmadığını belirlemek için kullanılır.
Örnek: 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"
İlişki parçası adlarıyla çalışmak için diğer iki PackUriHelper yöntemi kullanılabilir. PackUriHelper.GetRelationshipPartUri , kaynak parça adı verilen bir ilişki parçası adı döndürür. PackUriHelper.GetSourcePartUriFromRelationshipPartUri , belirli bir ilişki parçası adı için kaynak bölüm adını döndürür.
Denklik için URI'leri karşılaştırma
Paket oluştururken veya kullanırken parçaları depolamak için önbellek kullanan bir uygulamanın eşdeğer parça adları için denetimler gerçekleştirmesi gerekebilir. PackUriHelper.ComparePartUri yöntemi, parça adlarının denkliğini denetler.
Örnek: 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"
İki "pack:" URI'sinin sözcük temelli denkliğini belirlemek için PackUriHelper.ComparePackUri yöntemini kullanın.
Örnek: 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"
Bir "pack:" URI'sinden Bileşen URI'lerini ayıklama
Bileşen paketi URI'sini ve parça URI'sini bir "pack:" URI'sinden ayıklamak için sırasıyla PackUriHelper.GetPackageUri ve PackUriHelper.GetPartUri yöntemlerini kullanın.
Örnek: 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"
Örnek: GetPartUri Örneği
//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"