在Proc會話狀態是在兩個階段abadone:當Wroker進程回收或會話超時。狀態服務器缺點
我需要保持敏感的會話變化,應用程序依賴於它的存在。 所以我做了兩件事。
1-建立會話超時>表單認證超時。
2-使用狀態服務器。使用狀態服務器導致性能問題,所以我使用緩存來提高性能。
這是CRM應用程序的一部分,其中員工搜索客戶時,發現客戶被加載到會話狀態,然後當員工導航到任何頁面時,所有頁面都知道我們談論的是哪個客戶。我認爲這種方法比使用加密的QueryStrings更好。
你覺得怎麼樣?有什麼我想念的嗎?
有沒有更好的pradigm可以幫助其他建築更多?
感謝
public class ContextManager : Manager
{
private static Customer m_Customer;
public static void LoadCustomer(int customerID)
{
if (customerID <= 0)
{
throw new ArgumentException("customer id should be >= 0");
}
m_Customer = CustomerManager.FindCustomerByID(customerID);
HttpContext.Current.Session["Customer"] = m_Customer;
}
public static Customer Customer
{
get
{
if (m_Customer == null) // for performance. the code visit this place very frequently in one http request
{
CheckCustomerInSession();
m_Customer = HttpContext.Current.Session["Customer"] as EdaraFramework.DOC.Customer.Customer;
}
return m_Customer;
}
}
private static void CheckCustomerInSession()
{
if (HttpContext.Current.Session["Customer"] == null)
{
// Pages accepted to have a null customer are default page and customer Search
// , Customer Edit is where LoadCustomer is called.
if ((!HttpContext.Current.Request.Path.Contains("Default.aspx"))
&& (!HttpContext.Current.Request.Path.Contains("CustomerSearch.aspx")))
{
m_Customer = null;
HttpContext.Current.Response.Redirect("~/Default.aspx");
}
}
}
}
我怎麼想的,我編輯帖子,謝謝 – Costa
緩存也是用戶之間共享。圖片我們是您的應用程序的2個用戶。我想編輯客戶「George」,您正在編輯客戶「Sally」。我把客戶喬治放在Cache中。然後用「Sally」覆蓋「George」。我的網頁認爲我仍在編輯George,所以我將所有更改保存到「Sally」。您通過使用靜態字段和緩存添加了額外的競爭條件。 – MatthewMartin
但我使用客戶ID作爲關鍵。 – Costa