c# - 减少 Web 应用程序中的全局状态

标签 c# asp.net web-applications global-variables session-variables

有很多关于全局状态替代方案的帖子,但我对网络环境中的实现有一些挥之不去的问题。

在 ASP.NET 中,存储在 session 中的值实际上是全局变量,但似乎您无法在页面和事件之间合理存储,例如经过身份验证的用户名、权限等,而不求助于 Session[ ]集合。 (我通常会使用依赖注入(inject),但您不想将 viewstate/url 中的这些值传递给客户端。)

所以我认为全局状态是 Web 开发中不可避免的祸害(由于 HTTP 的无状态本质),答案就是负责任地使用它。什么是一个好的实现外观模式?静态类(例如下面的静态类)仅在 session 中获取设置值,对于掩盖全局状态没有多大作用。

public class SessionWrapper
{
    public static string UserName
    {
        get { return Convert.ToString(Session["UserName"]); }
        set { Session["UserName"] = value; }
    }
    public static bool IsAuthenticated
    {
        get { return Convert.ToBoolean(Session["IsAuthenticated"]); }
        set { Session["IsAuthenticated"] = value; }
    }
}

最佳答案

全局变量有问题,但全局没问题。因此,如果您想减轻全局状态的“问题​​”,只需使这些对象不可变即可(我不明白 DI 有何相关性)。

HttpContext 对象的 User 属性对于存储此类状态很有用,因为它需要可供应用程序的每个部分使用,但只能在应用程序的早期分配。管道。

因此,只需提出您自己的 System.Security.Principal.IPrincipal 实现,其中包含您想要的额外属性,并将其分配给 HttpContext.Current.User例如,在 AuthenticateRequest 事件期间。

关于c# - 减少 Web 应用程序中的全局状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14716687/

相关文章:

c# - 更改 ScrollViewer 滚动条自动隐藏计时器的默认时间

c# - 过程或函数需要未提供的参数

c# - WebActivatorEx 在应用程序启动时导致 ArgumentException

java - CSRFTester 不生成 html 文件

css - 从浏览器打印 POS/收据 (Citizen CT-S651)

c# - AspNetCompiler - 尝试加载格式不正确的程序

c# - 如何通过应用程序配置禁用 Raygun.io 客户端?

javascript - jquery .on 不适用于动态内容

asp.net - 使用 URLRouting 从 FormsAuthentication 迁移到 OWIN 后,安全页面上出现 HTTPException - 不重定向到 LoginPath

java - 如何自动化测试以检查 JSF 应用程序的正确性?