我有一个需要从 Web 服务调用的大型 COM 对象。所以我实现了一个 IHttpAsyncHandler 类,希望持有对 COM 对象的引用。这样,请求之间的加载时间就会减少。我在 Windows 2003 服务器上运行 IIS 6。
看起来 HttpHandler 程序集(?)在处理后会卸载,因为我的静态列表在后续调用中是空的。即使第二次调用非常直接,它也会发生:
public class x2Handler : IHttpAsyncHandler, System.Web.SessionState.IRequiresSessionState
{
public bool IsReusable { get { return true; } }
private static List<AsynchOperation> _asynch = new List<AsynchOperation>();
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
{
AsynchOperation asynch = null;
foreach( AsynchOperation op in _asynch){
if (op.Completed){
asynch = op;
break;
}
}
if (asynch == null)
{
asynch = new AsynchOperation();
_asynch.Add(asynch);
}
asynch.Context = context;
asynch.Callback = cb;
asynch.State = extraData;
asynch.StartAsyncWork();
return asynch;
}
public void EndProcessRequest(IAsyncResult result)
{
}
public void ProcessRequest(HttpContext context)
{
throw new InvalidOperationException();
}
}
每当调用进程时,_asynch 都是空的。应用程序池似乎没有任何会导致程序集卸载的设置。
如何使静态变量在调用之间保持其值?
编辑:我不知道它是否有助于解决这个问题,但如果我有一个断点并且它被击中,然后我删除断点,当代码再次执行时(因为另一个 HTTP 请求)断点仍然是放。
编辑:我在类中添加了一个析构函数并在其中放置了一个断点来确定是什么杀死了这个类,它是从“Appdomain Transition”中调用的。
编辑:我尝试从 IRequiresSessionState 继承,然后将测试值分配给 context.Session 和 context.Application,两者在调用之间都不保存它们的值。那么应用程序池是否有可能在调用之间被释放?