我正在开发一个 Intranet.NET MVC 应用程序。我需要存储与每个经过身份验证的用户相关的用户详细信息,例如位置、ID 号等。
在 .NET Webform 应用程序中,我们曾经在会话中保存登录用户的详细信息。但是 .NET MVC 应用程序的最佳实践是什么?
我正在开发一个 Intranet.NET MVC 应用程序。我需要存储与每个经过身份验证的用户相关的用户详细信息,例如位置、ID 号等。
在 .NET Webform 应用程序中,我们曾经在会话中保存登录用户的详细信息。但是 .NET MVC 应用程序的最佳实践是什么?
您仍然可以在 MVC 中使用会话状态,但不建议这样做。MVC 作为一种模式尊重 HTTP 的无状态性。
一种替代方法是使用仅将信息存储在内存中的缓存。这是一个包含更多信息的 SO 问题:为什么 ASP.NET MVC 会使用会话状态?
有几种方法可以给这只猫剥皮,但我认为将个人资料信息附加到用户将是最优雅的。
您需要一个 Profile Provider 来保存您的用户的个人资料数据。您可以将 SqlProfileProvider 用于 SQL Server,但我建议您查看 Microsoft ASP.NET Universal Providers 参考:http ://www.nuget.org/packages/Microsoft.AspNet.Providers
接下来是 Scott Hanselman 的一些无耻的复制和粘贴。假设您要跟踪用户的生日:
public class MyCustomProfile : ProfileBase
{
public DateTime? Birthdate {
get { return this["Birthdate"] as DateTime?; }
set { this["Birthdate"] = value; }
}
}
然后你会在你的 web.config 中设置它:
<profile inherits="MyApp.Models.MyCustomProfile" defaultprovider="DefaultProfileProvider"></profile>
最后,您可以使用以下方法提取当前用户的自定义配置文件:
var customProfile = HttpContext.Profile as MyCustomProfile;
DateTime? birthday = customProfile.Birthdate;
您必须设置数据存储,但这主要是需要做的。您可以在 Scott Hanselman 的博客中找到完整的细节:http ://www.hanselman.com/blog/IntroducingSystemWebProvidersASPNETUniversalProvidersForSessionMembershipRolesAndUserProfileOnSQLCompactAndSQLAzure.aspx
我认为“为工作使用正确的工具”这句格言适用于此。只要正确使用,我认为在会话中存储数据没有任何问题。
MVC 为短期状态(ModelState 和 TempData)提供了其他机制。如果这些满足您的需求,请使用它们。TempData 无论如何都在幕后使用 SessionState (如这个问题所示)。如果您真正需要的是在用户会话期间保持状态的数据并且不再需要,那么 SessionSate 是完成该任务的好工具。
使用缓存也很好,但您需要管理缓存的过期/失效。我发现缓存对于不依赖于会话或用户的事物最有用,无论它们是更短还是更长的寿命。