6

我正在开发一个 Intranet.NET MVC 应用程序。我需要存储与每个经过身份验证的用户相关的用户详细信息,例如位置、ID 号等。

在 .NET Webform 应用程序中,我们曾经在会话中保存登录用户的详细信息。但是 .NET MVC 应用程序的最佳实践是什么?

4

3 回答 3

1

您仍然可以在 MVC 中使用会话状态,但不建议这样做。MVC 作为一种模式尊重 HTTP 的无状态性。

一种替代方法是使用仅将信息存储在内存中的缓存。这是一个包含更多信息的 SO 问题:为什么 ASP.NET MVC 会使用会话状态?

这里还有一个:避免在 ASP.NET MVC 中使用会话状态是一种好习惯吗?如果是,为什么以及如何?

于 2013-08-29T11:58:35.777 回答
1

有几种方法可以给这只猫剥皮,但我认为将个人资料信息附加到用户将是最优雅的。

您需要一个 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

于 2013-08-29T12:18:56.180 回答
0

我认为“为工作使用正确的工具”这句格言适用于此。只要正确使用,我认为在会话中存储数据没有任何问题。

MVC 为短期状态(ModelState 和 TempData)提供了其他机制。如果这些满足您的需求,请使用它们。TempData 无论如何都在幕后使用 SessionState (如这个问题所示)。如果您真正需要的是在用户会话期间保持状态的数据并且不再需要,那么 SessionSate 是完成该任务的好工具。

使用缓存也很好,但您需要管理缓存的过期/失效。我发现缓存对于不依赖于会话或用户的事物最有用,无论它们是更短还是更长的寿命。

于 2013-08-29T12:47:17.167 回答