2009-11-23 24 views
7

dan zamanında ASPX sayfa oluştur:aşağıdaki kodu varsayarsak veritabanı

public class DynamicAspxHandler : IHttpHandler { 
    bool IHttpHandler.IsReusable { get { return false; } } 

    void IHttpHandler.ProcessRequest(HttpContext httpContext) { 
     string aspxContent = PlainASPXContent(); 
     Page page = CreatePage(httpContext, aspxContent); 
     page.ProcessRequest(httpContext); 
    } 

    Page CreatePage(HttpContext context, string aspxContent) { 
     // How to implement this? 
    } 
} 

nasıl CreatePage ASPX düz dize içeriğine göre bir sayfayı örneğini yöntemi uygulayabilir?

Not, ASPX dizesinin kendisinin diskteki mevcut MasterPage öğesine başvuruda bulunabilmesidir.

Bununla ilgili büyük bir performans sorunu olması gerektiğini biliyorum, ancak bu aşamada bunu nasıl yapabileceğimi bilmek istiyorum. Açıkçası sonucu önbelleğe almak zorunda kalacağım.

Teşekkürler.

+0

Soru için bekliyorum. Mümkünse harika olurdu. İyi soru. –

+0

Aşağıdaki Gonzalo ve Rex girişleri doğrudur, ancak yeni bir VirtualPathProvider alt sınıfının uygulanmasının tam güven izinleri gerektirdiğini (veya bir noktada yaptığını) ve paylaşılan bir barındırma ortamında çalıştırılamayabileceğini unutmayın. – Chris

+0

Evet. Tam güven büyük bir sınırlamadır. Orta güven ile bir çözüm elbette daha iyi olurdu. –

cevap

9

aşağı gitmeye çalışıyoruz yolu zaten web sunucusu dosya sistemi daha başka depolama mekanizmasından yükleme ASPX dosyaları olduğunu. Bunun bir parçasını uygulamaya başladık, ancak aslında bunu yapmak için özel bir HttpHandler'a ihtiyacınız yok - ASP.NET'in gerçek ASPX biçimlendirmesinin diğer kaynaklarını belirleyen mevcut bir mekanizması var.

Bu, VirtualPathProvider olarak adlandırılır ve dosyaları diskten yüklemek için SQL Server'dan veya başka herhangi bir mantıkla yüklenerek varsayılan işlevselliği değiştirmenizi sağlar. Ardından, ASP.NET'in kendi başına kullandığı tüm yerleşik derleme ve önbelleklemelerden yararlanabilirsiniz.

işlevsellik çekirdek GetFile method gelir ve VirtualFile's Open():

public override VirtualFile GetFile(string virtualPath) 
{ 
    //lookup ASPX markup 
    return new MyVirtualFile(aspxMarkup); 
} 

//... 

public class MyVirtualFile : VirtualFile 
{ 
    private string markup; 

    public MyVirtualFile(string markup) 
    { 
     this.markup = markup; 
    } 

    public override Stream Open() 
    { 
     return new StringReader(this.markup); 
    } 
} 

Not bugün, tam güven gerektirir özel VirtualPathProvider kullanarak. Ancak, yakında ASP.NET 4.0 mevcut olacak ve orta güven altında VPP'leri destekliyor. Bunu yapmanın

+0

Çok iyi geliyor! Teşekkürler. ASP.NET MVC için bir örnek buldum: http://padcom13.blogspot.com/2009/04/virtualpathprovider-example.html –

+0

Aspx sayfasının arkasındaki kodu içeren bir derleme gerektirdiğini varsayalım. O zaman ne yapabiliriz? – Mark

İlgili konular