我如何使这个对象存在于会话中
本文关键字:会话 于会话 存在 何使这 对象 | 更新日期: 2023-09-27 17:51:13
这里的交易:我有一个网站,多人将共享相同的帐户,应该每个人都能够在一个页面上上传文件,并保持他们上传的文件列表的会话。文件上传页面的控制器看起来像
public class FileUploadController : Controller
{
// ...
private List<ThreePartKey> uploadedFiles = new List<ThreePartKey> ();
public ActionResult Index ( )
{
// ...
}
[HttpPost]
public ActionResult Index (HttpPostedFileBase file)
{
// ...
if (!errorOccured)
{
uploadedFiles.Add(new ThreePartKey { orgname = selectedOrgName, catname = selectedCatName, filename = fileNameNoExtension, fullfilepath = newFileUrlPathAndName });
}
// ...
}
,问题是每当[HttpPost] public ActionResult Index (HttpPostedFileBase file)
被调用时,uploadedFiles
总是被重新初始化,这意味着用户上传的文件列表只显示最后上传的文件。所以我尝试了
private static List<ThreePartKey> uploadedFiles = new List<ThreePartKey> ();
把一切都搞砸了,因为所有登录的用户都共享同一个列表。
有什么简单的方法可以做我想做的事吗?
Controller
被实例化并在每次请求时销毁。如果你想在一个web服务器上持久化信息,强烈建议使用一个永久的后备存储,比如数据库。
您可以在ASP中使用static
状态。. NET应用程序(WebForms, MVC, OWIN等),但这只推荐用于性能缓存。它不能依赖,因为static
状态仅本地当前AppDomain
在当前的应用程序池(w3wp.exe
实例)-如果你的网站运行在多个池或应用域,或者如果你的应用程序重新启动(或杀死由于不活动),那么存储的状态丢失。
选项是为每个请求提供一个'session'代码/id。当用户第一次连接到你的网站时,他们会得到一个会话代码(我使用"代码"来表示它与我们通常所说的"会话"无关)。
每个链接都有会话码作为url的一部分,每个帖子都包含会话码。然后你的上传缓存可以是:
private static ILookup<int, ThreePartKey> uploadedFiles;
(或字典,如果你喜欢)
private static IDictionary<int, IList<ThreePartKey>> uploadedFiles;
取决于你的网站的其余部分的大小,如果这是可行的或不-在大多数情况下,可能不像描述的…但是可以管理,例如使用IP地址作为"代码",或者如果你使用AnglurJS或单页应用程序。
如前所述,如果应用程序池被重置,例如通过IIS中的非活动超时设置,任何静态/单例缓存仍然会丢失。
另一个选项是根据用户的IP地址将文件保存在子文件夹中。
你只规定了他们都使用相同的登录名,而不是文件的存储方式等,所以这可能对你有用