IHttpAsyncHandler卸载

时间:2012-12-23 06:57:52

标签: c# iis ihttphandler

我有一个需要从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分配测试值,两者都不在调用之间保存它们的值。那么应用程序池是否可能在调用之间释放?

1 个答案:

答案 0 :(得分:0)

实际问题无关紧要。在调用COM对象之前,我编写了一个COM对象可以访问的文本文件。然后我将文本文件的名称传递给COM对象。问题是我正在将文件写入安装了HTTPHandler的当前目录。

猜测ASP.Net监视目录,bin文件夹中的任何更改都会导致应用程序在当前处理完成后卸载。因此应用程序将为每次调用卸载。移动文本文件解决了问题