هل هذه هي الطريقة الصحيحة للحصول على WebProfile؟
-
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
}
بحيث يتم استرداد حالة الملف الشخصي من الجلسة كلما كان ذلك ضروريًا ويجب التغلب على الحاجة إلى المتغيرات الثابتة.