2009-11-23 14 views
7

से रनटाइम पर ASPX पेज रेंडर नीचे कोड मान लिया जाये:डेटाबेस

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? 
    } 
} 

कैसे मैं CreatePage एक पृष्ठ ASPX के मैदान स्ट्रिंग सामग्री के आधार पर का दृष्टांत को विधि लागू कर सकते हैं?

नोट यह है कि एएसपीएक्स स्ट्रिंग डिस्क पर पहले से मौजूद मास्टरपेज के संदर्भ में खुद को संदर्भित कर सकती है।

मुझे एहसास है कि इसके साथ बड़ी प्रदर्शन समस्या होनी चाहिए लेकिन इस स्तर पर मैं सिर्फ यह जानना चाहता हूं कि मैं यह कैसे कर सकता हूं। जाहिर है मुझे परिणाम कैश करना होगा।

धन्यवाद।

+0

उत्तर के लिए तत्पर हैं। यह संभव है अगर यह आश्चर्यजनक होगा। अच्छा प्रश्न। –

+0

नीचे गोंजालो और रेक्स से इनपुट सटीक है, लेकिन ध्यान रखें कि एक नए वर्चुअलपाथप्रोवाइडर सबक्लास को लागू करने के लिए पूर्ण ट्रस्ट अनुमतियां (या एक बिंदु पर) की आवश्यकता होती है और साझा होस्टिंग वातावरण में चलाने योग्य नहीं हो सकती है। – Chris

+0

हां। पूर्ण विश्वास बड़ी सीमा है। मध्यम ट्रस्ट के साथ एक समाधान निश्चित रूप से बेहतर होगा, अगर ऐसा मौजूद है। –

उत्तर

9

जिस मार्ग को आप नीचे जाने की कोशिश कर रहे हैं वह आवश्यक है वेब सर्वर फ़ाइल सिस्टम की तुलना में किसी अन्य स्टोरेज तंत्र से एएसपीएक्स फ़ाइलों को लोड करना। आपने इसका हिस्सा लागू करना शुरू कर दिया है, लेकिन आपको वास्तव में ऐसा करने के लिए एक कस्टम HttpHandler की आवश्यकता नहीं है - एएसपी.NET के पास वास्तविक एएसपीएक्स मार्कअप के अन्य स्रोतों को निर्दिष्ट करने के लिए एक मौजूदा तंत्र है।

इसे VirtualPathProvider कहा जाता है, और यह आपको डिस्क से फ़ाइलों को लोड करने, कहने, SQL सर्वर से लोड करने या कहीं और समझने के लिए डिफ़ॉल्ट कार्यक्षमता को स्वैप करने देता है। फिर आप सभी अंतर्निर्मित संकलन और कैशिंग का लाभ उठा सकते हैं जो एएसपी.नेट स्वयं ही उपयोग करता है। एक कस्टम VirtualPathProvider का उपयोग कर पूर्ण विश्वास की आवश्यकता होती है कि आज

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); 
    } 
} 

ध्यान दें,:

कार्यक्षमता के मुख्य GetFile method में आता है और VirtualFile's Open()। हालांकि, जल्द ही एएसपी.नेट 4.0 उपलब्ध होगा और यह मध्यम ट्रस्ट के तहत वीपीपी का समर्थन करता है।

+0

बहुत अच्छा लगता है! धन्यवाद। मुझे यहां एएसपी.नेट एमवीसी के लिए एक नमूना मिला: http://padcom13.blogspot.com/2009/04/virtualpathprovider-example.html –

+0

मान लें कि एएसपीएक्स पेज को एक असेंबली की आवश्यकता है जिसमें कोड पीछे है। तब हम क्या कर सकते हैं? – Mark

1

ऐसा करने का एक तरीका VirtualPathProvider का उप-वर्ग बनाना है और इसे HostingEnvironment.RegisterVirtualPathProvider पर कॉल करके होस्टिंगइन्वायरमेंट। वर्चुअलपाथप्रोवाइडर के रूप में सेट करना है। आपको कुछ तरीकों को ओवरराइड करना होगा। GetFile() के रूप में सबसे महत्वपूर्ण है। निर्माण प्रणाली कैशिंग का ख्याल रखेगी।