global.asax، المتغيرات العالمية، والتحرير مع التعليمات البرمجية

StackOverflow https://stackoverflow.com/questions/908803

سؤال

لدي سؤالان:

1) لدي بعض المتغيرات العالمية لموقع الويب الخاص بي أعلن في بلدي global.asax. ملف. إنها أزواج مفاتيح / قيمة صغيرة بسيطة ولا يوجد سوى عدد قليل منها. هل هذه ممارسة جيدة للقيم الصغيرة وتحتاج إلى الوصول إليها من خلال كل صفحة تقريبا على موقع الويب الخاص بي؟ يخزنها في قاعدة البيانات وتتطلب بحث DB يبدو أنه يعتقد أنه يضيع الموارد للقيم التي لا تتغير بسرعة.

2) إذا تغيرت إحدى القيم مرة واحدة في الأسبوع، هل من الممكن السماح للمستخدم بتحرير المتغير العالمي مع نموذج أو بعض الوسائل الأخرى؟

مثال:

<script runat="server">

  Overloads Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)

      Application("default_scoring_id") = 3
      Application("week_current") = 3

  End Sub

</script>

في المثال أعلاه، يحتاج النظام إلى معرفة أي أسبوع (من 15 منهم) أن التاريخ الحالي في الداخل. لذلك، مرة واحدة كل صباح الاثنين، تحتاج القيمة "أسبوع_Current" إلى التغيير.

يمكنني القيام بذلك بسهولة، ولكن هل هناك طريقة لإعطاء مستخدم الوصول إلى تغيير هذه القيمة دون لمس التعليمات البرمجية؟

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

المحلول

الممارسة النموذجية هي وضع هذه في Web.config، والتي يمكن تحريرها. هؤلاء <appSettings> ستكون القيم بعد ذلك متاحة في كل صفحة، ومع ذلك، يمكن تحرير الملف.

نصائح أخرى

1) الممارسة الجيدة هي عادة لتخزين هؤلاء القيم في web.config. يرى هنا و هنا لبعض الأدلة.

2) أ) إذا قمت بتخزين هذا في Web.config، فسيتم حلها بسهولة دون الحاجة إلى إعادة ترجمة وإعادة إدخال وتطبيق الويب يجب أن تلتقط التغييرات على الفور.

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

أود أن أفكر في استخدام ذاكرة التخزين المؤقت المدمجة (system.web.caching.cache)

وبهذه الطريقة يمكنك تخزينها حيث تريد أي وقت مضى (تقول في قاعدة بيانات)، قم بتغييرها من داخل التطبيق بسهولة، ولديها استرجاع سريع ورخيص.

من داخل فئة ما يرث من BadePage استخدم كائن ذاكرة التخزين المؤقت المعطاة (مثل ذاكرة التخزين المؤقت .add (..) ومن ثم استخدم HttpContext.current.cache (على سبيل المثال. httpcontext.current.cache.remove (المفتاح))

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

lock(globalsharedobject) //This is C# code.
{
    Application("default_scoring_id") = 3;
}

Web.config هو طريقة .NET، أو طريقة ASP.NET، إنها ليست دائما الأكثر فعالية أو أكثر ملاءمة.

أنت ملف Global.asax أكثر بكثير من بعض الأحداث، يمكنك وضع بيانات ثابتة في أي فئة يقوم بها Subsclass System.web.htttpapplication ورثته في ملف Global.asax الخاص بك.

إن httpsessionSessionState و httpapplicationState هي آثار، من وقت ASP الكلاسيكي وستفعل جيدا لتجنبها، لأنك لا تخدم أي غرض حقيقي.

اعتمادا على النوع (SYSTEM.TYPE) من الكائنات الخاصة بك، يمكنك تصميم كائناتك المكتوبة بشدة التي تخزن معلومات حول التطبيق والجلسة الخاصة بك، بالنسبة لبيانات مستوى التطبيق، ستكون مجموعة من الحقول الثابتة كافية.

يجب أن يكونوا ثابتا لأن كل httpmodule بالإضافة إلى مثيل httpapplication تم تجميع الكائن، لذلك لتجنب هذا الارتباك، تأكد من تخزين بياناتك المستمرة في Dicionaries ثابتة أو عدة ولكن كن على علم بقضايا التزامن عند تعديل هذه المجموعات. تتمثل استراتيجية جيدة في قفل الكائن، فقط للمدة التي تقوم بتعديلها وتأكد من عدم استدعاء أي رمز آخر أثناء وجود مجموعة، قد تكون عبودية مبادلة بسيطة، وهي سريعة، إنها سريعة -Deadlock guarntee.

<%@ Application Language="C#" %>

<script runat="server">

    void Application_Start(object sender, EventArgs e) 
    {
    // Code that runs on application startup

    }

    void Application_End(object sender, EventArgs e) 
    {
    //  Code that runs on application shutdown

    }

    void Application_Error(object sender, EventArgs e) 
    { 
    // Code that runs when an unhandled error occurs

    }

    void Session_Start(object sender, EventArgs e) 
    {

    // Code that runs when a new session is started

    }

    void Session_End(object sender, EventArgs e) 
    {
    // Code that runs when a session ends. 
    // Note: The Session_End event is raised only when the sessionstate mode
    // is set to InProc in the Web.config file. If session mode is set to StateServer 
    // or SQLServer, the event is not raised.

    }
    protected void Application_BeginRequest(Object sender, EventArgs e)
    {
    Context.Items.Add("Request_Start_Time", DateTime.Now);
    }
    protected void Application_EndRequest(Object sender, EventArgs e)
    {
    TimeSpan tsDuration = DateTime.Now.Subtract((DateTime)Context.Items["Request_Start_Time"]);
    Context.Response.Write("<b>Request Processing Time: From Global.asax file " + tsDuration.ToString());
    Application["time"] = tsDuration.ToString();
    }

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