2011-09-19 155 views
1

在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"); 
       } 
      } 
     } 
    } 

回答

1

我想你可能想退後一步,真正考慮你在做什麼。

「使用狀態服務器造成性能問題......」

這使用了未存儲在網絡服務器存儲過程的會話時的預期。順便說一句,這是我總是主張關閉會議的主要原因之一。

當您開始添加Web服務器時,會話真的發生故障。此外,大多數人傾向於在會話中存儲很多東西,卻沒有意識到服務器不得不花費時間串行化和反序列化會話數據,即使它沒有在有問題的頁面上使用。當此數據存儲在第三臺服務器上以支持Web場時,由於所有網絡流量,花費的時間大大增加。此外,您從單個故障點(一個Web服務器)轉到多個故障點(網絡,交換機,電纜,狀態服務器等)。

看看你可以得到完全擺脫了會議的依賴,並移動到爲客戶搶奪詳細信息,請查詢字符串中使用的加密ID。當然,您仍然需要驗證用戶帳戶是否可以訪問這些客戶詳細信息,但無論如何您都應該這樣做。

0

這是一個壞主意,你會得到國家的意想不到的共享用戶不同的應用程序和靜態字段令人驚訝的復位中,當應用程序域被卸載。如果您需要使用會話來延長活動時間,請使用StateServer或Sql Session。

注意,靜態成員堅持不僅 同一會話的往返之間,也同樣 應用的不同會話之間。這意味着在同一時間 工作的多個用戶將在同一個對象上工作。

編號: http://www.velocityreviews.com/forums/t122181-static-fields-in-asp-net-pages.html

狀態服務器是在存儲結構。如果它有性能問題,我會感到驚訝。 Sql Session寫入磁盤,所以它有一個性能影響,但通常不足以注意到。狀態服務器是否正在運行,您是否遇到超時錯誤,或頁面加載時間是否突然跳躍?

性能問題通常是由長時間運行的存儲過程或一個頁面中過多的存儲過程調用引起的。

+0

我怎麼想的,我編輯帖子,謝謝 – Costa

+1

緩存也是用戶之間共享。圖片我們是您的應用程序的2個用戶。我想編輯客戶「George」,您正在編輯客戶「Sally」。我把客戶喬治放在Cache中。然後用「Sally」覆蓋「George」。我的網頁認爲我仍在編輯George,所以我將所有更改保存到「Sally」。您通過使用靜態字段和緩存添加了額外的競爭條件。 – MatthewMartin

+0

但我使用客戶ID作爲關鍵。 – Costa