سؤال

أنا متأكد من أنني ارتكبت بعض الأخطاء الفادحة الواضحة التي لا أستطيع رؤيتها.آمل أن يتمكن أحدكم من تصحيح حالتي.

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

أسمي جلساتي مثل هذا:

UserInfo userinfo = UserInfo.Session;

يستخدم فصل mgt الخاص بي هذا:

static UserInfo userInfo;

static public UserInfo Session
{
    get
    {
        if (userInfo == null)
        {
            userInfo = new UserInfo();
            userInfo.ResetSessionTime();
        }
        return userInfo;
    }
}

قرأت وأكتب البيانات مثل هذا.أدرك أنه يمكنني إجراء تسلسل للفصل بأكمله، ولكن يبدو أن إجراء تسلسل وإلغاء تسلسل فصل كامل في كل مرة يتم استدعاء الفصل فيها يتطلب الكثير من الجهد بدلاً من مجرد الحصول على العنصر أو العنصرين اللذين أحتاجهما.

Decimal _latitude;
private String SessionValue(String sKey, String sValue, String sNewValue)
    {
        String sRetVal = "";
        if (sNewValue == null)//not wanting to update anything
        {
            if (sValue == null)//there is no existing value
            {
                sRetVal = (String)System.Web.HttpContext.Current.Session[sKey];
            }
            else
            {
                sRetVal = sValue;
            }
        }
        else
        {
            System.Web.HttpContext.Current.Session[sKey] = sNewValue;
            sRetVal = sNewValue;
        }
        return sRetVal;
    }



    public Decimal Latitude
    {
        get { return SessionValue("Latitude", _latitude); }
        set { _latitude = SessionValue("Latitude", _latitude, value); }
    }

شكرا لمساعدتك

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

المحلول

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

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

وبالتالي فإن قيمة _latitude يسبب لك هذه المسألة. وهناك حل بسيط هو:

public class Userinfo
{
    public Decimal Latitude
    {
        get { return System.Web.HttpContext.Current.Session["Latitude"]; }
        set { System.Web.HttpContext.Current.Session["Latitude"] = value; }
    }
}

وA، نسخة أكثر قابلة للاختبار أفضل سيكون:

public class UserInfo
{
    private HttpSessionStateWrapper _session;
    public UserInfo(HttpSessionStateWrapper session)
    ( 
       // throw if null etc
       _session = session;
    )

    public Decimal Latitude
    {
        get { return _session["Latitude"]; }
        set { _session["Latitude"] = value; }
    }
}

في الحالة الثانية، ضمن طلب انك بناء نسخة جديدة من في HttpSessionStateWrapper (باستخدام الدورة الحالية) وتمريرها إلى مثيل المعلومات حول المستخدم. عند اختبار، يمكنك تمرير فقط في التفاف وهمية.

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

نصائح أخرى

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

بمعنى آخر، سيحصل جميع المستخدمين على نفس مثيل UserInfo من UserInfo.Session.

لإصلاح هذا يمكنك:

  • تسلسل الفصل بأكمله في الجلسة.لا أعرف ما هي الممتلكات الأخرى التي لديك، ولكن أعتقد أنها لن تكون عبئًا كبيرًا.
  • قم بإنشاء مثيل UserInfo لكل طلب، بحيث يقرأ المستخدم دائمًا من مثيل جديد، والذي بدوره سيؤدي إلى تحديث قيمه من الجلسة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top