Var sayılma ve Hoş Geldiniz arka! Benim Parag Agarwal, Microsoft'ta bir destek mühendisine adıdır. Bu ay size Microsoft ASP.NET 2. 0'daki sanal yol sağlayıcısı tartışmak için kullanacağınız.
GENEL BAKIŞ
Bu ay nasıl içerik ve derleme, ASP.NET 2.0 dosyaları sanal bir erişim sağlayarak, ASP.NET'in genişletileceğini tartışılacaktır. Bu özellik, uygulamalar, içerik yerine fiziksel dosya sistemindeki bir veritabanında depolanır, Microsoft SharePoint Portal Server, benzer oluşturmak için kullanılabilir. Bu makalede, istenen Web form sayfası içeriğini bir Microsoft SQL Server veritabanında depolandığı bir örnek oluşturur.
Sanal yol sağlayıcısı
Bir sanal yol sağlayıcısı ile ASP.NET derleme sistemine sanal içerik için biz genişletebilirsiniz bir düzenek sağlar. Örneğin, bir sanal yol sağlayıcısı, dosya sistemi dışındaki konumlardan içerik kaynağı için bir yol sağlar. Sanal içerik sağlamak isteyen geliştiriciler, aşağıdaki görevleri gerçekleştirmelisiniz:
- VirtualPathProvider bir sınıf oluşturmak ve dosya ve klasör istekleri işlemek için tüm gerekli yöntemleri uygulayın.
- <a1>Kayıt</a1> ortam barındıran ASP.NET için sanal yol sağlayıcısı biliyor burada içeriği gelen hizmet.
- Içerik akışı VirtualFile ve sanal dizin nesneleri oluşturma.
VirtualPathProvider sınıfı hakkında daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitesini ziyaret edin:
Hangi içeriğin sanallaştırılmış?
Browseable, ASPX, <a1>ana sayfa</a1>, ASCX ve temaları sanallaştırılmış yalnızca maddeler türleridir.
Uygulama çağrıları
AppInitialize statik yöntem ve
Global.asax dosyası içinde tanımlanan olayları yapıldıktan sonra başlatıldı. Bu yöntem çağrıları
VirtualPathProvider sınıfı kaydedilebilir yalnızca iki yerlerdir.
Derleme App_Code ve App_Data klasörleri gibi üst düzey öğelerin yaşam döngüsü için kaydetmek istediğiniz sağlayıcıyı uygulamanın içinde herhangi bir noktada etkilenip etkilenmedikleri edemiyor.
Varsayılan olmayan göz içeriği sanallaştırmak için <a0></a0>, size
BuildProvider sınıf eşlemeniz gerekir.
BuildProvider sınıfı nasıl ASP.NET oluşturma ve ortam kullandığı
BuildProvider sınıfı, farklı dosya türleri için kaynak kodu hakkında daha fazla bilgi için aşağıdaki MSDN Web sitesini ziyaret edin:
Derleme Modeli
Sanal yol sağlayıcısı için size bir örnek oluşturmadan önce size ASP.NET 2.0 derleme modelindeki başlıca Bileşenleri'ne genel bakış aracılığıyla gelecektir. Bu genel bakış, bize nasıl içerik açmasını ve bir Web sayfasına gözatmak için Microsoft Visual Studio'da Web sitesi oluşturma ASP.NET'in yapı sistemi tarafından derlenen anlamanıza yardımcı olur.
ClientBuildManager sınıfı
Sistem birleştirmeler oluşturma, kaynak kodu oluşturma ve ASP.NET ile etkileşim tarafından pre-compilation gerçekleştiren Apı'ler oluşturmak
ClientBuildManager sınıf sunar.
ClientBuildManager sınıf, yapı sistemi dışında Microsoft ınternet ınformation Services (IIS) erişim sağlar. Visual Studio 2005,
ClientBuildManager sınıf'ı kullanarak, ıntellisense deyim tamamlama ve gerçek zamanlı hata raporlaması gibi harika özellikler sağlar.
ClientBuildManager sınıfı, dosya veya sanal ve fiziksel yolları da sağlar. Daha fazla bilgi için aşağıdaki MSDN Web sitesini ziyaret edin:
BuildManager sınıfı
BuildManager sınıfı derlemeler ve uygulama sayfalarında derleme işlemi yönetir. Daha fazla bilgi için aşağıdaki MSDN Web sitesini ziyaret edin:
BuildProvider sınıfı
BuildProvider sınıf, belirli bir dosyayı ayrıştırmak ve karşılık gelen kod dosyası oluşturmak için işlevler sağlar. Daha fazla bilgi için aşağıdaki MSDN Web sitesini ziyaret edin:
AssemblyBuilder sınıfı
AssemblyBuilder sınıfı, bir Dinamik derleme ile tüm derleme bağımlılıklar listesini gösterir. Bu sınıf, kaynak kodu veya bir derleme işlemi sırasında derleme sağlayıcısı tarafından sağlanan
CodeCompileUnit nesnesi bekliyor. Daha fazla bilgi için aşağıdaki MSDN Web sitesini ziyaret edin:
Bir veritabanından geliyor sanal içerik için sanal yol Sağlayıcısı'nı genişletme
Sanal yol sağlayıcısı ve derleme modeli ile ilgili genel bir anlayış bölümlerimiz artık, biz küçük bir SharePoint Portal oluşturabilirsiniz Hizmetleri benzeri olmayan dosya tabanlı içeriğine erişim sağlayan uygulama.
Not Örnek uygulama oluşturma başlamadan önce veritabanı yapısı ve örnek kullanılan Web sitesi hiyerarşi konunda us arayın:
Veritabanında
VirtualFileSystem adlı tek bir tablo yok. Bu tablo, aşağıdakine benzer:
Bu resmi kapatBu resmi aç
Web sitesi hiyerarşi içinde Visual Studio, aşağıdakine benzer:
Bu resmi kapatBu resmi aç
Notları- App_Code klasöründe bir sanal yol sağlayıcısı VirtualPathProvider sınıfı, sanal dizin sınıfı, VirtualFile sınıfı ve bir yardımcı sınıf olarak uygulamak için gerekli olan tüm sınıflarını içerir.
- SharePointDir klasörü, bir sanal dizini gösterir. Bu sanal dizinin içeriğini veritabanında depolanır. Bu klasör içindeki bir sayfa için herhangi bir istek ASP.NET çalışma zamanı tarafından sanal bir dosya için bir istek olarak değerlendirilir.
- Biz CRUD gerçekleştirebileceğiniz bir kullanıcı arabirimi AdminstrationPage.aspx sayfayı görüntüler GridView denetiminin yardımıyla sanal içeriği (oluşturma, okuma, güncelleştirme ve silme) işlemleri. AdminstrationPage.aspx sayfa aşağıdakine benzer:
Bu resmi kapatBu resmi aç
Us konunda örnek oluşturmaya başlayın.
Bunu yapmak için şu adımları izleyin:
- Visual Studio 2005'i başlatın.
- Tam bir sıradüzeni ve önceki görüntüde görünen dosyaları içeren bir Web sitesi oluşturur.
- SharePointDirectory.cs kaynak dosyayı açın.
- Aşağıdaki ad SharePointDirectory.cs dosyasında bulunan doğrulayın:
using System;
using System.Collections;
using System.Data;
using System.Security.Permissions;
using System.Web;
using System.Web.Hosting;
- SharePointProvider sınıf bildirmek ve VirtualPathProvider RESULTCLASS devralır
public class SharePointProvider :
VirtualPathProvider
- Bir anahtar-değer çifti //from veritabanı alınan iki özel members.
//It contains the file name and content as a key-value pair retrieved
//from the database.
Hashtable virtualFiles = null;
DBUtility utility = null;
- AppInitialize yöntemi ekleyin. Bu işlem en önemli yöntemi AppInitialize yöntemidir. ASP.NET uygulama başlatma sırasında çalışma zamanı alt yapısı, bu yöntem çağırır.
Not Bu yöntem bu sınıf, bir Web.config dosyası olmadan yüklemek ASP.NET çalışma zamanı vermiyoruz bir el ile olarak düşünülebilir.
Bu yöntemi ile birlikte birden fazla sınıf varsa, bir derleme hatası oluşur. Bu yöntem içinde biz bizim sağlayıcısı ile ASP.NET barındırma ortamında kaydetmek. Şimdi tüm istekleri bir Web sayfası için bu sağlayıcıyı. geçecek public static void AppInitialize()
{
HostingEnvironment.RegisterVirtualPathProvider(new SharePointProvider());
} - Kurucu SharePointProvider sınıfı için uygular. Bu adım, size sanal tüm dosyaları ve içeriklerini hızlı erişim için bellekte tanımlamanızdan bağlıdır. Bellek içi sonuç kümesi, içeriği geçersiz kadar çaba göstereceğiz. Içerik veritabanında içerik değiştiğinde tamamlanmaz güncelleştirilmesi gerekiyor.
public SharePointProvider(): base()
{
utility = new DBUtility();
virtualFiles = utility.GetVirtualFiles();
} - Sonra IsPathVirtual yöntemi ekleyin. Bu yöntemi kullanarak, biz istenen dosyayı sanal bir yolu olup olmadığını belirleyebilirsiniz. Zaten SharePointDir klasördeki istenen dosyanın bir sanal. alınır verdik
private bool IsPathVirtual(string virtualPath)
{
String checkPath =
VirtualPathUtility.ToAppRelative(virtualPath);
return checkPath.StartsWith("~/SharePointDir".ToLower().ToString(), StringComparison.InvariantCultureIgnoreCase);
} - FileExists yöntemi, dosyanın var olup olmadığını döndürür. Bu doğrulama istenen dosyanın veritabanında bulunan yapar. Dosya yoksa, daha önce kaydedilmiş sanal yol sağlayıcısı nesnesi başvurusunu derleme sistemdeki edinir ve dosyayı yeniden FileExists yöntemi çağrılarak bulmak deneyecek. Dosyayı yine de bulunmazsa, size başka alırsınız "404 (dosya bulunamıyor)" hata iletisini.
public override bool FileExists(string virtualPath)
{
if (IsPathVirtual(virtualPath))
{
SharePointVirtualFile file = (SharePointVirtualFile)GetFile(virtualPath);
// Determine whether the file exists on the virtual file
// system.
if (utility.CheckIfFileExists(virtualPath))
return true;
else
return Previous.FileExists(virtualPath);
}
else
return Previous.FileExists(virtualPath);
} - Benzer şekilde DirectoryExists yöntemi vardır. Bu yöntem, sağlayıcı bir bağımsız değişken olarak geçirilen sanal dosya yolu hizmet vermeden, doğru döndürecektir. Aksi durumda, sağlayıcı sağlayıcının daha önce kaydedilmiş sanal dosya yolu zamanki verir ve klasörü yoksa, biz 404 hata iletileri yeniden alırsınız.
public override bool DirectoryExists(string virtualDir)
{
if (IsPathVirtual(virtualDir))
{
// Right now, we are not storing the directory information in
// our SharePoint Portal Services database. We assume that all of the virtual
// content is served from a directory that is named SharePointDir and was
// created inside the ASP.NET Web site. Therefore, we will always
// return TRUE in this case.
SharePointVirtualDirectory dir = (SharePointVirtualDirectory)GetDirectory(virtualDir);
return true;
}
else
return Previous.DirectoryExists(virtualDir);
} - Sonraki GetFile ve GetDirectory yöntemleri vardır. FileExists ve DirectoryExists yöntem çağrıları başarılı olduktan sonra ASP.NET çalışma zamanı, bu yöntem sanal yol sağlayıcısı çağırır.
//This method is used by the compilation system to obtain a VirtualFile instance to
//work with a given virtual file path.
public override VirtualFile GetFile(string virtualPath)
{
if (IsPathVirtual(virtualPath))
return new SharePointVirtualFile(virtualPath, this);
else
return Previous.GetFile(virtualPath);
}
//This method is used by the compilation system to obtain a VirtualDirectory
//instance to work with a given virtual directory.
public override VirtualDirectory GetDirectory(string virtualDir)
{
if (IsPathVirtual(virtualDir))
return new SharePointVirtualDirectory(virtualDir, this);
else
return Previous.GetDirectory(virtualDir);
} - Daha sonra bu örnek. VirtualFile sınıfı tarafından kullanılan birkaç yardımcı programı yöntemleri eklemeniz gerekir
public string GetFileContents(string virPath)
{
return utility.GetFileContents(virPath);
}
public Hashtable GetVirtualData
{
get { return this.virtualFiles; }
set { this.virtualFiles = value; }
} Not bu örnekte, biz düzenek sanal içeriğe yapılan değişiklikler yapı sisteme bildirmek için kullanmıyorsunuz demektir. Sanal sağlayıcının önbelleği sanal kaynak yardımcı olmak için kullanılan GetCacheDependency adlı bir API sunar. Dosyalardan herhangi birinin geçersiz duruma geldiğinde size önbellekteki geçersiz kılar. Daha fazla bilgi için aşağıdaki MSDN Web sitesini ziyaret edin: - Biz ana sağlayıcı sınıfıyla yapılır. Şimdi SharePointDirectory.cs kaynak dosyayı açın. Bu sınıf sanallaştırılmış kaynaklar için bir özet işlevi görecek. Sanal dizin sınıfı hakkında daha fazla bilgi için aşağıdaki MSDN Web sitesini ziyaret edin:
- Sanal dizin sınıfı soyut bir sınıf olduğundan, size tüm Soyut yöntemler geçersiz kılmak gerekir. Bu örnekte <a0></a0> size sanal içeriği tek bir sanal dizin içinde geliyor varsayalım çünkü ancak size ek uygulama geçersiz kılınmış Bu yöntemlerde sağlamaz. Bu nedenle, sınıf tanımı aşağıdaki gibi görünecektir:
public class SharePointVirtualDirectory : VirtualDirectory
{
SharePointProvider spp;
public SharePointVirtualDirectory(string virtualDir, SharePointProvider provider) : base(virtualDir){spp = provider;}
private ArrayList children = new ArrayList();
public override IEnumerable Children {get {return children;}}
private ArrayList directories = new ArrayList();
public override IEnumerable Directories{get {return directories;}}
private ArrayList files = new ArrayList();
public override IEnumerable Files{get { return files;}}
} - Artık, biz VirtualFile soyut sınıfını SharePointVirtualFile adlı bir sınıf tanımlamak hazırsınız. Bu sınıf, OpenFile adında geçersiz kılınmış bir özet yöntem olacaktır. ASP.NET tarafından kullanılan bir akışı örneği OpenFile yöntemi döndürür sanal dosyayı kullanmak için bir ortam oluşturmak.
public class SharePointVirtualFile : VirtualFile
{
private SharePointProvider spp;
private string virPath;
public SharePointVirtualFile(string virtualPath, SharePointProvider provider) : base(virtualPath)
{
this.spp = provider;
this.virPath = virtualPath;
}
public override Stream Open()
{
string fileContents = spp.GetFileContents(virPath);
Stream stream = new MemoryStream();
if (fileContents != null || fileContents.Equals(String.Empty))
{
// Put the page content on the stream.
StreamWriter writer = new StreamWriter(stream);
writer.Write(fileContents);
writer.Flush();
stream.Seek(0, SeekOrigin.Begin);
}
return stream;
}
} - En son olarak, biz DBUtility.cs dosyasında DBUtiliity sınıfı tanımlayacaktır. Yöntem uygulama sağlanmadı. DBUtiliity sınıfı, içeriği ile birlikte diğer birkaç yardımcı program işlevleri veritabanından elde etmek için sağlayıcı sınıfları tarafından kullanılır.
public class DBUtility
{
SqlConnection cnn;
string connectionString = "connectionstring to DB…";
//Run a select query to obtain all files and their content, and
//store the result in a in memory hashtable to obtain fast access.
string cmdSelectAllFiles = "SELECT FileName,FileData FROM VirtualFileSystem";
Hashtable virtualFiles = null;
public DBUtility(){ virtualFiles = new Hashtable();}
public Hashtable GetVirtualFiles()
{
/* 1. Open a connection.
2. Select all the files.
3. Iterate through the result and store the file name as a Key and
content as a Value in a hashtable.
4. Finally return hashtable.
*/
return virtualFiles;
}
public string GetFileContents(string virPath)
{
//Obtain a file name from the virtual path.
string fileName = ExtractFileName(virPath);
//Ater you obtain the file name, find it in the hashtable, and then
//return the content for that file from the Values collection.
}
private string ExtractFileName(string virPath)
{
//Extract a file name from the virtual path and return it.
}
public bool CheckIfFileExists(string virPath)
{
string fileName = ExtractFileName(virPath);
//After you extract the file name, find it in the hashtable of
//virtual files. If the file name is found, return true. Otherwise, return false.
}
}
Bu sağlayıcı içeriği işlenen değiştirebilirsiniz ayrıcalıklı bir işlem olduğundan kaydetme akılda tutulması gereken Not bir şey olur. Özel sınıflar VirtualPathProvider, sanal dizin ve VirtualFile sınıfı altında tam güven izinlerini'nı çalıştırmanız gerekir. Daha fazla bilgi için aşağıdaki MSDN Web sitesini ziyaret edin: - Size yapılması sağlayıcı sınıfları ve şimdi bizim uygulama yazma sanal içerik hazırdır. Uygulamayı vermek için Görünüm ve davranış bir SharePoint Portal Services Yönetimi Web sayfasının bir AdministrationPage.aspx sayfa Web sitesinin kök klasörde oluşturduğum. The page contains a GridView control that is bound with a virtual table.
<asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns="False" DataSourceID="SqlDataSource1" >
<Columns>
<asp:BoundField DataField="FileName" HeaderText="FileName" />
<asp:TemplateField HeaderText="Remote Content" >
<ItemTemplate>
<asp:Label ID="Label1" runat="server"
Text="FileContent...."></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="Label1" runat="server" Text='<%#
Eval("FileData", "{0}") %>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:HyperLinkField HeaderText="Virtual Path"
DataTextField="VirtualPath" Target="_self"
DataNavigateUrlFormatString= "{0}"
DataNavigateUrlFields="VirtualPath" />
<asp:CommandField ShowEditButton="True"
ShowDeleteButton="True" CausesValidation="false"
HeaderText="Operations" CancelText="Cancel" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$
ConnectionStrings:VirtualProviderDBConnectionString %>"
SelectCommand="SELECT [FileName], [FileData], [VirtualPath] FROM
[VirtualFileSystem] Where [FileName] LIKE '%aspx%'”>
</asp:SqlDataSource>
Sonuç
Sanal yol sağlayıcısı için bu tüm, şimdilik. Umarım bu sütun, ASP.NET 2.0 için temel bir derleme işlemi anlamanıza yardımcı olur ve hizmet verdiği bir veritabanından biz çalışmak gibi içeriği olmayan dosya tabanlı içeriği ASP.NET çalışma zamanı nasıl izin verebilirsiniz.
Zaman için teşekkürler. ASP.NET 2. 0 ' eklenen yeni özellikleri hakkında daha fazla yazma bekler. Daha fazla bilgi ve örnekler için MSDN Web sitelerini ziyaret edin:
Her zaman olarak, gelecekte sütunları adreslenmiş istediğiniz konuları veya bilgi bankasının
Ask For It
(http://support.microsoft.com/common/survey.aspx?scid=sw;en;1176&p0=&p1=&p2=&p3=&p4=)
formunu kullanarak fikir gönderme bildirmekten çekinmeyin.