【问题标题】:Static List - WebMethod with EnableSession静态列表 - 带有 EnableSession 的 WebMethod
【发布时间】:2013-06-17 20:24:54
【问题描述】:

我在带有表单身份验证的 asp.net 应用程序中使用 JTable (http://www.jtable.org/)。

我的网络应用程序将为每个成功登录的用户创建一个会话。

现在,Jtable 使用一个静态列表的数据源。这个静态列表所在的类不是静态的。

      public class UserSpecificClass
 {     
    [WebMethod(EnableSession = true)]
    public static object PaymentsList(int jtStartIndex, int jtPageSize, string jtSorting)
    {
     //Get data from database
            using (DBDataContext context = new DBDataContext(_staticConnString))
            {
                // LINQ Query - Get userDetails including all relationships to user
                var PaymentDetails = (from t1 in context.Charges
                                      join t2 in context.Invoices on t1.InvoiceID equals t2.ID
                                      where t2.MemberID == 5
                                      select new
                                      {
                                          Related_Invoice = t1.InvoiceID,
                                          Charge_Description = t1.ChargeType.Name,
                                          Charge_Amount = t1.Amount,
                                          Amount_Paid = t1.PaidAmount,
                                          Credited = t1.CreditAmount,
                                          Last_Payment = t2.PaidAmount == 0 ? "Not Paid" : t2.PaidDate.ToString()

                                      }).ToList();

                 _mhubPayments = new List<MHubPaymentsHistory>();
                foreach (var obj in PaymentDetails)
                {
                    MHubPaymentsHistory data = new MHubPaymentsHistory(obj.Related_Invoice, obj.Charge_Description, obj.Charge_Amount,
                                                obj.Amount_Paid, obj.Credited, obj.Last_Payment);

                    _mhubPayments.Add(data);
                }

                //Return result to jTable
                return new { Result = "OK", Records = _mhubPayments, TotalRecordCount = recordCount };
    }
}

现在,我知道静态变量和属性将被创建一次,并且在服务器上的应用程序域中可供所有用户使用......所以显然我担心的是我不希望 Web 应用程序中有 1 个 InvoicesList..

但我不确定当新用户登录并从上面的类中检索数据时,静态对象(在本例中为列表)是否是新登录用户特定的会话?由于“EnableSession = true”属性?

ie:如果有 100 个用户登录,那么在创建/发布的这 100 个会话中的每一个中,将 WebMethod(EnableSession) 属性附加到对象是否意味着每个用户会话都有一个特定于会话的静态列表对象?这基本上是说这个静态对象将是特定于会话的,因此是特定于用户的?

任何澄清表示赞赏。 在此先感谢

【问题讨论】:

  • 我没有看到任何静态字段。
  • 公共静态对象 PaymentsList ?
  • 这是一个函数。它不存储任何数据;你的问题没有意义。
  • 特别是,你有任何静态列表。
  • 好吧..但你知道我来自哪里吗?那么,考虑到您的更正,在这种情况下,此方法返回的对象是否是每个用户特定的会话?我试图了解在这种特定情况下使用“静态”的影响,并确保每个用户都不会看到任何其他用户信息?即时“更新”要返回的新类列表(List())这一事实是否足以确保显示的记录将是登录用户?我再次尝试通过 web 方法了解静态的使用并启用会话.. 谢谢

标签: c# jquery asp.net .net


【解决方案1】:

在这种情况下,静态数据可能会出现问题,因为整个应用程序只有一个存储位置,因此存储在那里的值在请求之间是可见的。静态方法没有相同的问题 - 静态方法可以在没有实例的情况下调用并且不能访问实例数据,但在其他方面与非静态方法相同。

【讨论】:

  • 谢谢 bmm6o - 我最初的问题和解释有几个错误,可能会产生误导,正如 SLaks 显然在上面指出的那样,但这更详细地回答了我的问题。感谢这篇文章中的每一个人。
【解决方案2】:

向方法添加属性不可能改变任何静态字段的行为方式。

如果您想使用会话状态,请将您的数据存储在HttpContext.Current.Session

【讨论】:

  • 没有帮助,与 Kev 想知道的事情无关。
  • @MichaelViktorStarberg:真的吗?你怎么理解这个问题?
  • 我开始回答但总结起来有问题。
  • SLaks:我会在允许的情况下对您的答案投赞成票,对问题投反对票。
  • 这次我显然用错了我的整个问题:(我已经转发给 SLaks 以前的 cmets,对我试图理解的内容进行了更准确的描述。我应该重新发布这个问题,重新措辞我试图理解我发布的代码?
猜你喜欢
  • 2012-01-05
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 2014-10-12
  • 2016-08-06
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多