我使用TempData
以便在使用RedirectToAction
时保留我的模型。它工作正常,但我有一种唠叨的感觉,它可能不是正确的做法。我真的试图避免使用Session数据,并且我已经读过TempData
使用Session。使用安全吗?在负载平衡环境中使用它可能会出现问题吗?
琐事问题:“它安全吗?” - 为电影命名。
答案 0 :(得分:22)
是的,TempData由会话存储支持,因此如果您处于负载平衡环境中,则在使用它时必须格外小心(粘性会话,持久会话状态等)。
TempData在使用PRG模式时一直是事实上的选择,并且是它的设计目标。
至于是否正确的做法......这取决于你的用例!
PS马拉松男子。答案 1 :(得分:5)
嗯,我认为这取决于。如果您使用负载平衡器和多个前端服务器处理大量流量,那么会话对象是可以避免的,因为它可能会降低性能并使得水平扩展变得困难(在场请求中并不总是来到同一个Web服务器)。
TempData是短暂的,如果你没有在那里放置很多对象并对整个架构三思而后行,我认为那是安全的。有很多站点广泛使用它并且没有问题(我在共享和专用托管站点上工作,每天访问量高达50-70万,使用会话,通常在同一台服务器上使用web和db)。
答案 2 :(得分:2)
我会尽可能地采取完全无国籍的做法。它更具可扩展性,不受单个服务器问题的影响。通常,您可以使用cookie(正确防止篡改)来识别用户并每次从数据库中提取数据。
除此之外,我还建议您评估是否可以使用View
代替RedirectToAction
。这样:
TempData["model"] = model;
return RedirectToAction("SomeAction");
可替换为:
return View("SomeAction", model);
当然假设“SomeAction”是一个可以从当前控制器访问的有效视图(它可以是同一个ctrl中的视图,也可以是在Shared中定义的视图),并且它不仅仅是重定向到另一个的中间动作。 / p>
答案 3 :(得分:2)
会话状态可以在群集环境中工作,前提是发生了两件事之一
是否应该使用tempdata的问题完全是一个不同的问题。我认为通常有办法绕过它。如果您试图避免命中数据库以重新加载已加载一个操作的对象,请查看使用缓存。
答案 4 :(得分:1)
我限制使用TempData在视图和操作之间传递模型对象验证消息。我没有从安全角度研究Tempdata的用法,但是在SO线程之后讨论了相同的问题:HttpContext.Items with ASP.NET MVC。请参阅最后几篇主题评论和相关讨论。