【问题标题】:Maintain state of the object for same browser session为同一浏览器会话维护对象的状态
【发布时间】:2014-06-24 18:14:32
【问题描述】:

以下是我的 ASP.Net Web API 控制器代码。如您所见,这里使用了一个私有类对象 BL,并实现了两个 Get 方法。对于第一个方法 FetchAllDashboardByUserId(int userId),我传递了用户 id,以便可以启动 BL 对象。在同一个浏览器会话中,如果调用了第二个 get 方法,那么我不想传递用户 ID,因为默认情况下应该启动 BL,但目前情况并非如此。第二种方法的 BL 为空,所以我必须在方法调用中添加用户 ID - GetCardDataUI(int userId, int dashBoardID, int cardID)。我的问题是如何避免它。我的想法不正确吗:

  • 我对以下 URL 进行连续调用的单个打开浏览器是单个会话:

    webapi/ViewR?userId=1

    webapi/ViewR?userId=1&dashBoardID=1&cardID=3

我不想在第二个 URL 中传递 userId。请注意,如果我将类对象声明为静态,那么它会按预期工作,但这不是我想要的,它必须与用户绑定:

public class ViewRController : ApiController
    {
        // BL object for a user
        private static BL accessBL = null;

        // HTTP GET for Webapi/ViewR (Webapi - name of API, ViewR  - Controller with implementation)            

        [AcceptVerbs("Get")]
        public List<DashboardUI> FetchAllDashboardByUserId(int userId)
        {
            if (accessBL == null)
                accessBL = new BL(userId);

            // Use BL object for entity processing
        }

        [AcceptVerbs("Get")]
        public CardDataGetUI GetCardDataUI(int userId, int dashBoardID, int cardID)
        {
            if (accessBL == null)
                accessBL = new BL(userId);

            // Use BL object for entity processing
        }
    }

我希望第二种方法实现如何:

[AcceptVerbs("Get")]
            public CardDataGetUI GetCardDataUI(int dashBoardID, int cardID)
            {
               // Use BL class object created in last call for entity processing
               // Should not pass userid again
            }

【问题讨论】:

标签: c# asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

您可以轻松地将数据存储在Session

... first request:

Session["userID"] = userID;

... next request:

int userID = (int)Session["userID"];  // should check for null first, but you get the idea...

但请记住以下几点:

  • 会话变量存储为objects,因此您需要进行类型转换和/或类型检查
  • 会话变量可以是null
  • 会话在大约可配置的时间(web.config)后过期
  • 默认会话状态是内存中,这意味着如果应用程序池重新启动会话状态消失 - 您可以将会话存储在文件或数据库中以保持更长时间
  • 除非您使用持久性存储(文件、数据库),否则会话不会横向扩展
  • 存储在持久存储中的对象必须是可序列化的

【讨论】:

  • 这确实是解决方案,但需要 CodingDawg 在上面的链接中列出的 global.asax 中的后授权条目,否则会话对象始终为空
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多