我如何使这个对象存在于会话中

本文关键字:会话 于会话 存在 何使这 对象 | 更新日期: 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地址将文件保存在子文件夹中。

你只规定了他们都使用相同的登录名,而不是文件的存储方式等,所以这可能对你有用