Web サービスから呼び出す必要がある大きな COM オブジェクトがあります。そこで、COM オブジェクトへの参照を保持することを期待して、IHttpAsyncHandler クラスを実装しました。そうすれば、リクエスト間のロード時間が短縮されます。Windows 2003 サーバーで IIS 6 を実行しています。
静的リストが後続の呼び出しで空であるため、処理後に HttpHandler アセンブリ (?) がアンロードされるように見えます。2 番目の呼び出しがすぐに行われた場合でも発生します。
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 に割り当てようとしましたが、どちらも呼び出し間で値を保持しません。呼び出しの間にアプリケーション プールが解放されている可能性はありますか?