0

私はasp.net Webサイトに取り組んでいます。従来の vb6 ActiveX コンポーネントとやり取りするには、com 相互運用機能を使用する必要があります。多くの場合、コンポーネントはコンテキスト オブジェクト (それ自体が vb6 activex コンポーネント) をパラメーターとして受け取ることに依存しています。コンテキスト オブジェクトの構築にはかなりのコストがかかります。

したがって、1 つのアイデアは、コンテキスト オブジェクトを一度構築し、asp.net セッションに格納することです。ただし、このオブジェクトが ActiveX コンポーネントの単なる .net ラッパーである場合、そのようなオブジェクトをセッションで永続化することは賢明であり、賢明でしょうか?

さらに、コンテキスト オブジェクトにはユーザー固有の情報が含まれているため、.net HttpRuntime キャッシュを使用した永続化を使用できますが、ユーザー固有のキーが必要になります。

asp.net session, aspnet-session questionで注意する必要があるその他の制限と事項を理解しています。

少し異なる方法で質問するには、com オブジェクトの単なるラッパーである .net オブジェクトを格納する際の問題または問題はありますか?

4

2 に答える 2

3

あるリクエストが別のリクエストをブロックすると、非常に急速に問題が発生すると思います。

ASP.NET は既定でスレッド上で COM を初期化し、スレッドをマルチスレッド アパートメントに配置します。VB6 コンポーネントはせいぜいアパートメント モデルでした。つまり、MTA スレッドがコンポーネントを作成すると、メイン STA が既に存在する場合 (ASP.NET ワーカー プロセスの場合は存在しません)、または STA 専用の新しいスレッドが作成された場合は、そのコンポーネントがメイン STA に配置されます。コンポーネントを作成する MTA スレッドに関係なく、MTA モデルを処理できないコンポーネントには常に同じ STA が使用されます。つまり、これらのコンポーネントへのすべての呼び出しに同じスレッドが使用されるため、同時呼び出しは順番に待機する必要があります。

シングルスレッド コンポーネントの COM を初期化するように ASP.NET に指示するには、少なくとも実行中のページと同じスレッドでオブジェクトが作成されるようにするには、AspCompat属性を@Pageディレクティブに追加します。

オブジェクトを再利用するとクロススレッドの問題が発生する可能性が非常に高いため、オブジェクトをキャッシュしません。

于 2008-10-08T21:47:37.093 に答える
0

それが望ましい効果でない限り、ユーザーごとに一度構築されないように、キャッシュに永続化します。

于 2008-10-08T20:52:40.870 に答える