我正在尝试创建一个单独的对象,该对象应该用于每次调用我的服务器。 但由于某种原因,每次调用Web API时,静态对象都会保持更新。 有什么方法可以阻止它吗?我该怎么办?
感谢您的回答,以下是一些代码:
The Singleton:
private static CoreEngine _instance;
public static CoreEngine Instance
{
get { return _instance ?? (_instance = new CoreEngine()); }
}
private CoreEngine(){}
WebAPI方法:
CoreEngine _coreEngine = CoreEngine.Instance;
[System.Web.Http.Route("Compare")]
public void PostCompare([FromUri]string pluginName, [FromUri]string file)
{
var plugin = _coreEngine.GetPlugin(pluginName);
if (plugin == null)
return;
plugin.Compare(file);
一个简单的客户:
public void Post(string uri, Dictionary<string,string> postDic)
{
using (var client = new HttpClient())
{
var postUri = FromDictionaryToUriString(uri, postDic);
var response = client.PostAsync(postUri, null).Result;
}
}
它只有一个线程和同步。
我尝试重复使用相同的POST
方法两次,并且在第一次使用CoreEngine
的第一个实例时,在第二次调用中,CoreEngine
已被处理,并且实例被重新创造。
答案 0 :(得分:3)
简短的回答是:这就是应该如何运作的。答案很长already written here.
答案 1 :(得分:0)
我试图复制这种奇怪的行为而不能。我的静态变量在多个请求中保持不变。静态对象应该在.NET Web Api上小心使用,因为它们会在请求中保留在内存中,直到应用程序池被回收。它们也不是线程安全的。
存在更好的地方,例如
HttpContext.Current.Application["myKey"]
此外,您可以使用与 Redis.io 类似的单独进程来维护该计算机或计算机之间的缓存。