سؤال

على افتراض الكود أدناه:

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؟

الملاحظة هي أن سلسلة ASPX نفسها يمكن أن تتسبب في الإشارة إلى Masterpage الموجود بالفعل على القرص.

أدرك أنه يجب أن تكون هناك مشكلة في الأداء الضخمة مع هذا ، لكن في هذه المرحلة أريد فقط أن أعرف كيف يمكنني القيام بذلك. من الواضح أنني سأضطر إلى تخزين النتيجة.

شكرًا.

هل كانت مفيدة؟

المحلول

المسار الذي تحاول النزول تحميل ملفات ASPX من بعض آلية التخزين الأخرى من نظام ملفات خادم الويب. لقد بدأت في تنفيذ جزء من ذلك ، لكنك في الواقع لا تحتاج حتى إلى httphandler مخصص للقيام بذلك - لدى ASP.NET آلية موجودة لتحديد مصادر أخرى لعلامة ASPX الفعلية.

يطلق عليه VirtualPathProvider, ، ويتيح لك تبديل الوظيفة الافتراضية لتحميل الملفات من القرص مع ، على سبيل المثال ، تحميلها من SQL Server أو في أي مكان آخر. بعد ذلك ، يمكنك الاستفادة من جميع التجميعات المدمجة والتخزين المؤقت التي يستخدمها ASP.NET من تلقاء نفسها.

جوهر الوظيفة يأتي في طريقة getFile و ال افتراضي VirtualFile ():

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

لاحظ أنه اليوم ، فإن استخدام VirtualPathProvider مخصص لا يتطلب الثقة الكاملة. ومع ذلك ، ستتوفر قريبًا ASP.NET 4.0 ويدعم VPPs تحت الثقة المتوسطة.

نصائح أخرى

طريقة واحدة للقيام بذلك هي من خلال إنشاء فئة فرعية من VirtualPathProvider ووضعه على أنه مضيف include.virtualpathprovider عن طريق الاتصال HostingEnvironment.registerVirtualPathprovider. سيكون عليك تجاوز بعض الطرق. الأهم يجري getFile (). سوف يعتني نظام البناء بالتخزين المؤقت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top