2011-09-19 104 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