Asp.net mvc ASP.NET MVC-使用会话的替代方案

Asp.net mvc ASP.NET MVC-使用会话的替代方案,asp.net-mvc,session,Asp.net Mvc,Session,我有一个ASP.NET MVC视图,用于将文件发布到我的一个控制器,以便在我的应用程序中使用。我注意到Uploadify的一个副作用是,当Flash file Uploadify用于将文件提交到服务器,并将文件发布到我的控制器时,它会从ASP.NET获取自己的SessionID。当然,如果我的上传控制器没有使用会话来存储当前用户上传的文件列表,以便我的应用程序在将来进行操作,那么这将是很好的。。。因此,考虑到这个问题,在我用我的视图上传文件之后,当前用户的会话不包含任何刚刚发布的文件 关于如何在

我有一个ASP.NET MVC视图,用于将文件发布到我的一个控制器,以便在我的应用程序中使用。我注意到Uploadify的一个副作用是,当Flash file Uploadify用于将文件提交到服务器,并将文件发布到我的控制器时,它会从ASP.NET获取自己的SessionID。当然,如果我的上传控制器没有使用会话来存储当前用户上传的文件列表,以便我的应用程序在将来进行操作,那么这将是很好的。。。因此,考虑到这个问题,在我用我的视图上传文件之后,当前用户的会话不包含任何刚刚发布的文件


关于如何在不依赖会话(最好是没有数据库)的情况下实现我想要的内容,有什么建议吗?

既然Uploadify纯粹是一个前端脚本,我不明白为什么它会从ASP.NET获取会话。我也不完全理解你的特殊问题是什么


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

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

需要交叉检查的一件事是:您是否在上传之前向会话添加了一些数据,从而使会话处于“活动”状态?ASP.NET会重新生成会话,直到会话中有数据。

这就是我提出的解决方案。我并没有做太多的测试,但在我当前的场景中,它似乎是会话的一个可接受的替代方案。我将使用Global.asax的Session\u End/Session\u 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.");
    }
}
公共类用户表:字典
{
公共新对象此[字符串键]
{
得到
{
对象值=空;
if(HttpContext.Current!=null)
{
var sessionId=HttpContext.Current.Session.sessionId;
if(ContainsKey(sessionId)&&base[sessionId].ContainsKey(key))
value=base[sessionId][key];
}
其他的
抛出新异常(“不存在HttpContext”);
返回值;
}
设置
{
if(HttpContext.Current!=null)
{
var sessionId=HttpContext.Current.Session.sessionId;
如果(!ContainsKey(sessionId))
添加(sessionId,newdictionary());
如果(!base[sessionId].ContainsKey(键))
base[sessionId].Add(键,值);
其他的
base[sessionId][key]=值;
}
其他的
抛出新异常(“不存在HttpContext”);
}
}
公共对象此[string sessionId,string key]
{
得到
{
对象值=空;
if(ContainsKey(sessionId)&&base[sessionId].ContainsKey(key))
value=base[sessionId][key];
返回值;
}
设置
{
如果(!ContainsKey(sessionId))
添加(sessionId,newdictionary());
如果(!base[sessionId].ContainsKey(键))
base[sessionId].Add(键,值);
其他的
base[sessionId][key]=值;
}
}
公共void添加(字符串sessionId)
{
添加(sessionId,newdictionary());
}
公共无效添加()
{
if(HttpContext.Current!=null)
添加(HttpContext.Current.Session.SessionID);
其他的
抛出新异常(“不存在HttpContext”);
}
公共新作废删除(字符串sessionId)
{
移除(sessionId);
}
公共空间删除()
{
if(HttpContext.Current!=null)
删除(HttpContext.Current.Session.SessionID);
其他的
抛出新异常(“不存在HttpContext”);
}
}

基本上这就是问题所在,是的。我考虑过将上传的数据缓存到数据库中,但这看起来像是在用卡车敲打钉子……事实上,这一点都不坏。谢谢你,先生。当然,在像咖啡店的用户这样的场景中,这不会很好地工作-尽管如果我通过上传操作传递会话ID,然后使用会话ID的哈希映射,我可以直接使用提供的会话ID。是否可以为给定的会话ID获取会话对象?不同的会话ID表示如果新会话已就位,则旧会话将不再可用(当前会话不可用),除非您保存上一个会话。会话是一个对象,您可以将其存储在散列中,但是我认为解决方法会导致比它解决的问题更多的问题。但你指的是咖啡店的案例是什么?用户更改IP地址?在咖啡店场景中,将有多个用户具有相同的IP地址,从而使我的UserTable桥接多个用户。如果使用会话ID,我可以保证该值是唯一的。我在上面的帖子中添加了我的“UserTable”实现。它似乎做了我想要的,虽然我还没有严格测试它。显然,我不打算用UserTable替换会话,因为在这一场景中我只需要UserTable。尽管如此,我还是将UserTable存储在BaseController中,供所有人访问。好的,明白了。这就是为什么我建议使用“user:ip”作为hashmap的键。我认为这种组合在99.99%的案例中应该是独一无二的。是的,会议实际上是现场的。这个问题与SWFUpload有关,而不仅仅是我。:)明白了。我会使用http调试器(如Fiddler2)查看线路上发生了什么。这里有些东西不太合拍。至少根据我蜘蛛侠的感觉。