كيفية الوصول إلى متغيرات جلسة العمل من أي فئة في ASP.NET?

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

  •  05-07-2019
  •  | 
  •  

سؤال

لقد خلق فئة الملف في مجلد App_Code في التطبيق.لدي الدورة متغير

Session["loginId"]

أريد الوصول إلى هذه الدورة المتغيرات في صفي ولكن عندما أكتب السطر التالي ثم أنه يعطي خطأ

Session["loginId"]

يمكن لأحد أن يقول لي كيفية الوصول إلى متغيرات جلسة العمل داخل الصف الذي يتم إنشاؤه في مجلد app_code في ASP.NET 2.0 (C#)

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

المحلول

(تحديث للتأكد من اكتمالها)
يمكنك الوصول إلى متغيرات جلسة العمل من أي صفحة أو التحكم باستخدام Session["loginId"] و من أي فئة (مثلا ، من داخل مكتبة فئة) ، وذلك باستخدام System.Web.HttpContext.Current.Session["loginId"].

ولكن يرجى قراءة بلدي الأصلي الإجابة...


أنا دائما استخدام التفاف الطبقة حول ASP.NET دورة تبسيط الوصول إلى متغيرات جلسة العمل:

public class MySession
{
    // private constructor
    private MySession()
    {
      Property1 = "default value";
    }

    // Gets the current session.
    public static MySession Current
    {
      get
      {
        MySession session =
          (MySession)HttpContext.Current.Session["__MySession__"];
        if (session == null)
        {
          session = new MySession();
          HttpContext.Current.Session["__MySession__"] = session;
        }
        return session;
      }
    }

    // **** add your session properties here, e.g like this:
    public string Property1 { get; set; }
    public DateTime MyDate { get; set; }
    public int LoginId { get; set; }
}

هذه الفئة مخازن مثيل واحد من نفسها في ASP.NET الدورة و يسمح لك بالوصول إلى الدورة خصائص في نوع-طريقة آمنة من أي فئة e.ز مثل هذا:

int loginId = MySession.Current.LoginId;

string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;

DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;

هذا النهج لديه العديد من المزايا:

  • فإنه يحفظ لكم من الكثير من نوع الصب
  • لم يكن لديك إلى استخدام ترميز-الثابت الدورة مفاتيح جميع أنحاء التطبيق الخاص بك (على سبيل المثالالدورة["loginId"]
  • يمكنك المستند الخاص بك الدورة العناصر عن طريق إضافة التعليقات doc XML على خصائص MySession
  • يمكنك تهيئة جلسة العمل الخاصة بك المتغيرات مع القيم الافتراضية (على سبيل المثالمؤكدا أنها ليست فارغة)

نصائح أخرى

وصول الدورة من خلال المواضيع HttpContext: -

HttpContext.Current.Session["loginId"]

والمشكلة مع الحل المقترح هو أنه يمكن كسر بعض ميزات الأداء في صلب SessionState إذا كنت تستخدم التخزين جلسة خارج العملية. (إما "وضع الدولة خادم" أو "وضع SQL خادم"). في أوضاع ووب يحتاج بيانات الجلسة لإجراء تسلسل في نهاية طلب الصفحة وإلغاء تسلسل في بداية طلب صفحة، والذي يمكن أن يكون مكلفا. لتحسين أداء محاولات SessionState إلغاء تسلسل فقط ما هو مطلوب من قبل فقط إلغاء تسلسل متغير عندما يتم الوصول إليه للمرة الأولى، وإعادة يسلسل فقط ويحل محل المتغير الذي تم تغييرها. إذا كان لديك الكثير من متغير جلسة ويشق كل منهم في فئة واحدة أساسا سيتم إلغاء تسلسل كل شيء في جلسة العمل الخاصة بك على كل طلب الصفحة التي تستخدم الدورة وكل شيء سوف تحتاج إلى إجراء تسلسل مرة أخرى حتى لو تغيرت الملكية 1 بيكواسي فقط الطبقة تغييرها. مجرد شيء للنظر إذا كان لديك باستخدام الكثير من الجلسة ووضع ووب.

الإجابات المقدمة من قبل الألغام توفير حلول ملائمة لهذه المشكلة ، ومع ذلك ، أشعر أنه من المهم أن نفهم لماذا هذا الخطأ النتائج:

على Session ملك Page يعود مثيل من نوع HttpSessionState نسبة إلى أن طلب معين. Page.Session هو في الواقع ما يعادل الدعوة Page.Context.Session.

MSDN يشرح كيف هذا ممكن:

لأن ASP.NET صفحات تحتوي على الافتراضي إشارة إلى النظام.ويب مساحة (الذي يحتوي على HttpContext الطبقة) ، يمكنك الرجوع إلى أعضاء HttpContext على .صفحة aspx بدون مؤهل الدرجة إشارة إلى HttpContext.

ومع ذلك ، عند محاولة الوصول إلى هذه الخاصية ضمن فئة في App_Code, الخاصية لن تكون متاحة لك إلا فئة مشتقة من فئة الصفحة.

حل بي هذا كثيرا ما واجه السيناريو هو أن لم تمر الصفحة الأشياء إلى فئات.وأود أن بدلا استخراج الكائنات المطلوبة من صفحة الدورة وتمريرها إلى الدرجة في شكل اسم-قيمة مجموعة / مجموعة / القائمة اعتمادا على الحالة.

وكان لي نفس الخطأ، لأنني كنت تحاول التلاعب متغيرات جلسة داخل فئة الدورة مخصصة.

وكان لي لتمرير السياق الحالي (system.web.httpcontext.current) في الصف، ثم عملت كل شيء على ما يرام.

MA

وهذا ينبغي أن يكون أكثر فعالية سواء بالنسبة للتطبيق، وكذلك للمطور.

إضافة الطبقة التالية لمشروع الويب الخاص بك:

/// <summary>
/// This holds all of the session variables for the site.
/// </summary>
public class SessionCentralized
{
protected internal static void Save<T>(string sessionName, T value)
{
    HttpContext.Current.Session[sessionName] = value;
}

protected internal static T Get<T>(string sessionName)
{
    return (T)HttpContext.Current.Session[sessionName];
}

public static int? WhatEverSessionVariableYouWantToHold
{
    get
    {
        return Get<int?>(nameof(WhatEverSessionVariableYouWantToHold));
    }
    set
    {
        Save(nameof(WhatEverSessionVariableYouWantToHold), value);
    }
}

}

وهنا هو التنفيذ:

SessionCentralized.WhatEverSessionVariableYouWantToHold = id;

في جوهر asp.net هذا يعمل differerently:

public class SomeOtherClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private ISession _session => _httpContextAccessor.HttpContext.Session;

    public SomeOtherClass(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void TestSet()
    {
        _session.SetString("Test", "Ben Rules!");
    }

    public void TestGet()
    {
        var message = _session.GetString("Test");
    }
}

المصدر: الشبكي: //benjii.me/2016/07/using-sessions-and-httpcontext-in-aspnetcore-and-mvc-core/

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