ASP.NET Web API - 请求特定的全局变量

时间:2016-12-21 16:12:58

标签: c# asp.net asp.net-web-api

当我收到Web API请求时,我想创建一个变量,在请求的生命周期中,每个类都可以访问该变量。我希望它可以像任何类的App.User一样以静态属性的形式访问。但我不希望在处理请求后保留它,所以我猜SessionState不是一个选项。这样做的正确方法是什么?

编辑: 它也需要是线程安全的。

2 个答案:

答案 0 :(得分:3)

Igor所述,一个选项是使用依赖注入和参数传递来使“全局”变量可供所有需要它的人使用。

但是如果你真的想使用静态属性,那么你可以使用HttpContext.Items属性来存储与当前请求有关的临时数据:

public class App
{
    public static IUser User
    {
        get { return (IUser)HttpContext.Current.Items["User"]; }
        set { HttpContext.Current.Items["User"] = value; }
    }
}

第三个选项(我推荐)是使用ThreadStatic属性支持的静态字段:

public class App
{
    [ThreadStatic]
    private static IUser user;

    public static IUser User
    {
        get { return user; }
        set { user = value; }
    }
}

此选项的优点是它不依赖于System.Web。但是,如果您的控制器是同步的,则有效,如果您使用async,它将会中断。

答案 1 :(得分:1)

HttpContext.Items专门用于此目的。

您放入的任何内容都将存在当前请求的生命周期,然后在之后被拆除。