4

我有一个mvc webapi服务设置,用于从sql server数据库中提取和推送数据。静态变量如何在Web会话中共享

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

public static class SystemProperties 
{ 
    public static int currentContactID; 
} 

当的WebAPI访问我剥从通话的HTTP标头的ContactID和SystemProperties.CurrentContactID设置它。

比在webapi的方法我访问SystemProperties.CurrentContactID数据调用。

我发现有一个问题,当有并发的webapi调用currentContactID越来越混淆。

我的问题是,如何在调用会话之间共享静态类成员?如果前一个人仍然在那里,那么他们会被那些将用他们的详细信息覆盖变量的新人搞砸了吗?

我应该使用不同的方法来存储这些细节吗?

在此先感谢

回答

2

您可以使用当前的HttpContext存储项目跨越一个HttpRequest

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

寿命使用,因此,你可以抓住从请求头中的数据,并将其存储在这里并且它将在该用户的当前http网络请求期间可用。每个http请求都有自己的Items字典,因此它不会被同时发生的请求覆盖。

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

0

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

使用Web API,请求以HttpRequestMessage的形式出现。您可以实现一个HTTP消息处理程序(从DelegatingHandler继承)并从那里去除HTTP头中的CurrentContactID。您还可以将已剥离的CurrentContactID值添加到HttpRequestMessage对象属性字典中。

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

下面是文章HttpRequestMessage的性能特性:http://msdn.microsoft.com/en-us/library/system.net.http.httprequestmessage.properties.aspx

请记住,在HttpRequestMessage属性属性是提供给您的控制器,以及它是为什么它适合用来代替静态类或会话。