5

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

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

public static class SystemProperties
{
    public static int currentContactID;
}

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

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

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

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

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

提前致谢

4

2 回答 2

3

您可以使用 Current HttpContext 来存储要在 HttpRequest 的整个生命周期中使用的项目

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

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

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

于 2013-10-02T00:41:08.093 回答
0

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

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

这是关于实现 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 属性在控制器上也可供您使用,这就是为什么它适合用于代替静态类或会话的原因。

于 2013-10-02T04:40:13.130 回答