ASP.NET MVC - 使用会话的替代方法

时间:2009-08-11 18:11:17

标签: asp.net-mvc session

我有一个ASP.NET MVC视图,它使用jquery.Uploadify将文件发布到我的一个控制器上,以便在我的应用程序中使用,我注意到上传的一个副作用是当Flashify文件使用上传时将文件提交到我的控制器的服务器帖子,它从ASP.NET获取自己的SessionID。当然,如果我的上传控制器没有使用Session来存储当前用户上传的文件列表以供我的应用程序将来操作,那就没问题了......所以考虑到这个问题,我上传文件后在我的View中,当前用户的会话不包含刚刚发布的任何文件。

关于如何在不依赖Sessions(最好是没有数据库)的情况下实现我想要的任何建议?

4 个答案:

答案 0 :(得分:2)

由于Uploadify纯粹是一个前端脚本,我不明白为什么它会从ASP.NET获得一个会话。我也不完全明白你的具体问题是什么。

如果您的问题是,一旦文件上传,用户无法在屏幕上看到它们,那么我建议找出显示独立于Uploadify的文件列表的方法。如果可以,让它与文件一起发送ID令牌,然后从数据库中获取显示列表所需的数据。

答案 1 :(得分:0)

也许是一个静态hashmap,哪个键是用户:客户端的ip? 该值将是您希望在不同会话中存储的任何对象。

答案 2 :(得分:0)

交叉检查的一件事 - 您是否通过在上传之前向其添加一些数据来使会话“实时”? ASP.NET重新生成会话,直到它在会话中有数据。

答案 3 :(得分:0)

这是我提出的解决方案。我没有做太多测试,但在我目前的场景中,它似乎是Session的可接受替代方案。我将使用Global.asax的Session_End / Session_Start来确保根据需要创建和删除行。

public class UserTable : Dictionary<string, Dictionary<string, object>>
{
    public new object this[string key]
    {
        get
        {
            object value = null;
            if (HttpContext.Current != null)
            {
                var sessionId = HttpContext.Current.Session.SessionID;
                if (ContainsKey(sessionId) && base[sessionId].ContainsKey(key))
                    value = base[sessionId][key];
            }
            else
                throw new Exception("No HttpContext present.");
            return value;
        }
        set
        {
            if (HttpContext.Current != null)
            {
                var sessionId = HttpContext.Current.Session.SessionID;
                if (!ContainsKey(sessionId))
                    Add(sessionId, new Dictionary<string, object>());
                if (!base[sessionId].ContainsKey(key))
                    base[sessionId].Add(key, value);
                else
                    base[sessionId][key] = value;
            }
            else
                throw new Exception("No HttpContext present.");
        }
    }

    public object this[string sessionId, string key]
    {
        get
        {
            object value = null;
            if (ContainsKey(sessionId) && base[sessionId].ContainsKey(key))
                value = base[sessionId][key];
            return value;
        }
        set
        {
            if (!ContainsKey(sessionId))
                Add(sessionId, new Dictionary<string, object>());
            if (!base[sessionId].ContainsKey(key))
                base[sessionId].Add(key, value);
            else
                base[sessionId][key] = value;
        }
    }

    public void Add(string sessionId)
    {
        Add(sessionId, new Dictionary<string, object>());
    }

    public void Add()
    {
        if (HttpContext.Current != null)
            Add(HttpContext.Current.Session.SessionID);
        else
            throw new Exception("No HttpContext present.");
    }

    public new void Remove(string sessionId)
    {
        base.Remove(sessionId);
    }

    public void Remove()
    {
        if (HttpContext.Current != null)
            Remove(HttpContext.Current.Session.SessionID);
        else
            throw new Exception("No HttpContext present.");
    }
}