维护同一浏览器会话的对象状态
本文关键字:对象 状态 会话 浏览器 维护 | 更新日期: 2023-09-27 18:10:03
以下是我的ASP。Net Web API控制器代码。这里你可以看到有一个私有类对象BL,它被使用并且两个Get方法都实现了。对于第一个方法FetchAllDashboardByUserId(int userId),我传递了用户id,以便可以初始化BL对象。在同一个浏览器会话中,如果调用第二个get方法,那么我不想传递userid,因为默认情况下应该启动BL,但目前情况并非如此。对于第二个方法,BL为空,因此我必须将userid添加到方法的调用中—GetCardDataUI(int userid, int dashBoardID, int cardID)。我的问题是如何避免它。我的想法是否错误?
-
一个打开的浏览器,我连续调用以下url是一个单一的会话:
webapi/ViewR吗?用户id = 1
webapi/ViewR ?用户id = 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
}
您可以轻松地将数据存储在Session
:
... first request:
Session["userID"] = userID;
... next request:
int userID = (int)Session["userID"]; // should check for null first, but you get the idea...
但请记住以下几点:
- 会话变量存储为
object
s,因此您需要强制转换和/或类型检查 - 会话变量可以是
null
- 会话在可配置的(
web.config
)大约时间后过期 - 默认会话状态在内存中,这意味着如果应用程序池重新启动会话状态消失-您可以将会话存储在文件或数据库中以保持更长时间
- 会话不会扩展,除非你使用持久存储(文件,数据库)
- 存储在持久存储器中的对象必须是可序列化的