サードパーティベンダーがプラグインDLLを記述して、それらをWebアプリのbinディレクトリにドロップできるアプリを作成しています。これらのプラグインが必要に応じて独自のHttpModuleを登録できるようにする機能が必要です。
とにかく、Web.Configに対応するエントリがなくても、実行時にパイプラインとの間でHttpModuleを追加または削除できますか、それともモジュールを追加/削除するときにWeb.Configをプログラムで編集する必要がありますか?どちらの方法でもAppDomainが再起動することはわかっていますが、同じ効果を実現するためにweb.configをファッジするよりも、コードでそれを実行したいと思います。
これは、HttpApplicationオブジェクトが初期化されるときであるHttpApplicationライフサイクルの適切なタイミングで実行する必要があります(複数回、HttpApplicationのインスタンスごとに1回)。これが正しく機能する唯一のメソッドは、HttpApplication Init()です。
コードを介してモジュールを接続するには、web.configのHttpModule定義の代わりに、次のようなコードを実行できます。
public class Global : System.Web.HttpApplication { // some modules use explicit interface implementation // by declaring this static member as the IHttpModule interface // we work around that public static IHttpModule Module = new xrnsToashxMappingModule(); public override void Init() { base.Init(); Module.Init(this); } }
HttpApplicationのInit()メソッドをオーバーライドしてから、静的インスタンスのInitメソッドにアクセスするだけです。モジュールのInit()はイベントをフックし、オフにします。
これは古い質問ですが、asp.net4はここで役立ついくつかの新しい機能を提供します。
具体的には、ASP.NET 4は、プログラムでHttpModuleを追加するために使用できるPreApplicationStartMethod
機能を提供します。
http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx でブログ投稿をしました。
基本的な考え方は、起動時にHttpModuleを動的に追加する機能を提供する派生HttpApplication
を作成し、各HttpApplication
インスタンスがapp-domain内に作成されるたびにそれらをパイプラインに初期化することです。
Dll Microsoft.Web.Infrastructure.dllには、DynamicModuleUtilityクラス内にこのためのメソッドがあります。 dllはWebPages1.0に同梱されています
public static class PreApplicationStartCode
{
private static bool _startWasCalled;
public static void Start()
{
if (_startWasCalled) return;
_startWasCalled = true;
DynamicModuleUtility.RegisterModule(typeof(EventTriggeringHttpModule));
}
}
これは、動的登録に役立ちました。
RegisterModule(typeof(RequestLoggerModule));
public class RequestLoggerModule : IHttpModule
{ ... }
ASP MVCの新しいバージョンでは、パッケージマネージャーを使用してWebActivatorXへの参照を追加し、次のような操作を行うことができます。
using WhateverNameSpacesYouNeed;
[Assembly: WebActivatorEx.PreApplicationStartMethod(typeof(YourApp.SomeNameSpace.YourClass), "Initialize")]
namespace YourApp.SomeNameSpace
{
public static void Initialize()
{
DynamicModuleUtility.RegisterModule( ... the type that implements IHttpModule ... );
}
}