如何在Web会话中共享静态变量

时间:2013-10-02 00:34:33

标签: c# asp.net-mvc asp.net-web-api global-variables shared-libraries

我有一个mvc webapi服务设置,可以从sql server数据库中提取和推送数据。

在拥有webapi的Web项目中,我有一个Static类,它只包含一些可从webapi方法访问的全局变量。以下是静态类的一个非常简洁的例子:

public static class SystemProperties
{
    public static int currentContactID;
}

当访问WebApi时,我从调用的Http Headers中删除ContactID,并将SystemProperties.CurrentContactID设置为它。

在webapi的方法中,我访问SystemProperties.CurrentContactID进行数据调用。

当发生并发webapi调用时,我发现一个问题是currentContactID混淆了。

我的问题是,静态类成员如何在调用会话之间共享?它是否会穿着最好的衣服,如果前​​一个人还在那里,那么他们会被那些用他们的细节覆盖变量的新人搞砸了?

我应该使用其他方法存储这些详细信息吗?

提前致谢

2 个答案:

答案 0 :(得分:2)

您可以使用Current HttpContext存储要在HttpRequest的生命周期内使用的项目

HttpContext.Current.Items["currentContactID"] = value

因此,您可以从Request标头中获取数据,并将其存储在此处,并且在该用户的当前http Web请求期间可用。每个http请求都有自己的Items字典,因此不会被同时发出的请求覆盖

如果您需要为同一用户的多个请求存储变量,则需要查看cookie或会话。

答案 1 :(得分:0)

是的,你应该使用不同的方法。

使用Web API,请求以HttpRequestMessage的形式出现。您可以实现HTTP消息处理程序(继承自DelegatingHandler),然后从HTTP Headers中剥离CurrentContactID。您还可以获取已剥离的CurrentContactID值,并将其添加到HttpRequestMessage对象属性字典中。

这是关于实现HTTP消息处理程序的文章:http://www.asp.net/web-api/overview/working-with-http/http-message-handlers

这是关于HttpRequestMessage的Properties属性的文章:http://msdn.microsoft.com/en-us/library/system.net.http.httprequestmessage.properties.aspx

请记住,HttpRequestMessage上的Properties属性也可以在控制器上使用,这就是它适合用于代替静态类或会话的原因。