هل هذه هي الطريقة الصحيحة للحصول على WebProfile؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

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

فيما يلي الأجزاء المهمة من الكود:

//here's the code on the web page

public static WebProfile p = null;

protected void Page_Load(object sender, EventArgs e)
{
    p = ProfileController.GetWebProfile();
    if (!this.IsPostBack)
    {
         PopulateForm();
    }       
}

//here's the code in the "ProfileController" (probably misnamed)
public static WebProfile GetWebProfile()
{
    //get shopperID from cookie
    string mscsShopperID = GetShopperID();
    string userName = new tpw.Shopper(Shopper.Columns.ShopperId,        mscsShopperID).Email;
    p = WebProfile.GetProfile(userName); 
    return p;
}

أنا أستخدم الأساليب الثابتة و static WebProfile لأنني بحاجة إلى استخدام كائن الملف الشخصي في ملف static WebMethod (أجاكس pageMethod).

  • هل يمكن أن يؤدي هذا إلى "مشاركة" كائن الملف الشخصي بواسطة مستخدمين مختلفين؟
  • هل لا أستخدم الأساليب والكائنات الثابتة بشكل صحيح؟

سبب تغيري WebProfile يعترض على أ static كان الكائن لأنني بحاجة إلى الوصول إلى كائن الملف الشخصي داخل ملف [WebMethod] (يتم استدعاؤه من جافا سكريبت على الصفحة).

  • هل هناك طريقة للوصول إلى كائن ملف التعريف داخل ملف [WebMethod]?
  • إذا لم يكن الأمر كذلك، ما هي الخيارات المتاحة لي؟
هل كانت مفيدة؟

المحلول

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

للتغلب على هذا، يجب أن يبدو الكود الخاص بك كما يلي:

public WebProfile p = null;

protected void Page_Load(object sender, EventArgs e)
{
    p = ProfileController.GetWebProfile();
    if (!this.IsPostBack)
    {
         PopulateForm();
    }       
}

public static WebProfile GetWebProfile()
{
    //get shopperID from cookie
    string mscsShopperID = GetShopperID();
    string userName = new tpw.Shopper(Shopper.Columns.ShopperId,        mscsShopperID).Email;
    return WebProfile.GetProfile(userName); 
}

لاحظ أنه لم يتم تعيين الكائن الثابت ويجب تعيين القيمة التي تم إرجاعها إلى مثيل NON STATIC لفئة ملف تعريف الويب في طريقة الاتصال الخاصة بك.

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

نصائح أخرى

@جيري

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

public WebProfile p = null;
private readonly string Profile_Key = "CurrentUserProfile"; //Store this in a config or suchlike

protected void Page_Load(object sender, EventArgs e)
{
    p = GetProfile();

    if (!this.IsPostBack)
    {
        PopulateForm();
    }       
}

public static WebProfile GetWebProfile() {} // Unchanged

private WebProfile GetProfile()
{
    if (Session[Profile_Key] == null)
    {
        WebProfile wp = ProfileController.GetWebProfile();
        Session.Add(Profile_Key, wp);
    }
    else
        return (WebProfile)Session[Profile_Key];
}

[WebMethod]
public MyWebMethod()
{
    WebProfile wp = GetProfile();
    // Do what you need to do with the profile here
}

بحيث يتم استرداد حالة الملف الشخصي من الجلسة كلما كان ذلك ضروريًا ويجب التغلب على الحاجة إلى المتغيرات الثابتة.

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