HTML上でロードする.NETアセンブリとアセンブリプローブの抑制

今日の備忘録より

.NETのカルチャ無しでビルドしたアセンブリ中のWindowsFormsコントロールを、AppletやActiveXのようにWebサーバからダウンロードしてHTML上で実体化する場合、対象のHTMLでは以下のようにタグを記述する。※1



    

※1実際にこの方式で使えるようにするには、特定のクラスから継承しなければならなかったり、プロパティやイベントを公開しようとすると、他にもいろいろとやらなきゃならないことがあるのだが、長くなるので敢えて触れていない。

このように書くと、実行時には.NETのアセンブリプローブが自動的に働き、Webサーバ上には対象のアセンブリと、それ以外の考えられる全てのプライベートパスに対して多数のリクエストが上がってしまう。
当然サーバからしたら見苦しいし、なにより管理者神からは文句を言われるので、必要無いリクエストは抑制したい。この"404 Not Found"対策としてよくあるのは、現在のカルチャに適合していると思われるパス、例えば日本であれば、"..\ja-JP"に、必要とされているファイルを、それもサイズ0のダミーとして配置しておくことだ。

 date       time     dos name        size   attr filename
2005/11/10 23:32:56 MSCORL~1.DLL        0      A mscorlib.resources.dll
2005/11/10 23:33:12 SYSTEM~1.DLL        0      A System.resources.dll

これで余計なHTTPリクエストがサーバに上がらないはずなんだけど、アセンブリの状態や例外が上がったのをきっかけにして、更にプローブ範囲が広がったりするのであまりスマートとはいえない。

そんな時は対象のアセンブリ用にconfigファイルを用意して、コードベースをきちんと書けば


  
    
      
      
    
  

これでconfigファイルが読込まれてコードベースが決定され、アセンブリのプローブが抑制されるので、余計なリクエストは上がらなくなり、管理者からは解放されるし、すっきりだ。

ただし、configファイルのパスは普通のアプリケーションとは違い、対象のアセンブリと同一のディレクトリに配置するだけでは読込んでくれない。というのも、このケースでは対象のアセンブリはIEが内部でロードしているに過ぎないので、プローブされるconfigファイルの名前は対象の"FooAssembly.dll.config"ではなく、なんと"iexplore.exe.config"なのだ。(Webサーバに上がるリクエストを調べれば判る)

正しいconfigファイルはどうやって読ませるのか? それは簡単で、以下のようにHTML中にタグで読込ませたい、適切なconfigファイルへの相対パスを記述すれば良いのだ。


   

ここまで対策してやっと対象のアセンブリとconfigファイルが、余計なリクエスト無しでロードされ、はれて.NETコントロールを実体化できるのである。※2

※2ロードしたアセンブリを安全に使うためには、クライアント側で、例えばサイト単位とかURL単位でコードセキュリティの設定を行わなきゃならないんだが、取り敢えずはFulltrustの設定を行うことが前提なんで、これに関しても省略している。