【发布时间】:2014-01-24 23:11:44
【问题描述】:
我正在尝试创建一个单例对象,每次调用我的服务器时都应该使用该对象。 但由于某种原因,静态对象会在每次调用 Web API 时保持更新。 有没有办法阻止它?我能做什么?
感谢您的回答,这是一些代码:
单身人士:
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 已被处置并重新创建实例。
【问题讨论】:
-
嗯...我不认为这是可能的。您是否使用没有粘性会话的负载均衡器?第二个猜测是正在发生进程外异常,导致您的应用程序池关闭,然后回收所有静态/缓存/会话数据
-
static是每个应用程序域。如果在不同的应用程序域上处理请求,则将创建一个新的单例对象(因为/如果重新使用工作人员,则请求上下文中已经存在单例)。 Web 应用程序通常应设计为共享 数据 而不是共享的单例对象。 -
如何在控制器中初始化_coreEngine?
-
托马斯-
CoreEngine _coreEngine = CoreEngine.Instance
标签: c# asp.net-mvc asp.net-web-api