web-dev-qa-db-ja.com

実行時にHttpModuleをプログラムで登録する

サードパーティベンダーがプラグインDLLを記述して、それらをWebアプリのbinディレクトリにドロップできるアプリを作成しています。これらのプラグインが必要に応じて独自のHttpModuleを登録できるようにする機能が必要です。

とにかく、Web.Configに対応するエントリがなくても、実行時にパイプラインとの間でHttpModuleを追加または削除できますか、それともモジュールを追加/削除するときにWeb.Configをプログラムで編集する必要がありますか?どちらの方法でもAppDomainが再起動することはわかっていますが、同じ効果を実現するためにweb.configをファッジするよりも、コードでそれを実行したいと思います。

44
jmcd

これは、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()はイベントをフックし、オフにします。

経由 Rick Strahlのブログ

52
Aaron Fischer

これは古い質問ですが、asp.net4はここで役立ついくつかの新しい機能を提供します。

具体的には、ASP.NET 4は、プログラムでHttpModuleを追加するために使用できるPreApplicationStartMethod機能を提供します。

http://www.nikhilk.net/Config-Free-HttpModule-Registration.aspx でブログ投稿をしました。

基本的な考え方は、起動時にHttpModuleを動的に追加する機能を提供する派生HttpApplicationを作成し、各HttpApplicationインスタンスがapp-domain内に作成されるたびにそれらをパイプラインに初期化することです。

28
Nikhil Kothari

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));
    }
}
13

これは、動的登録に役立ちました。

RegisterModule(typeof(RequestLoggerModule));

public class RequestLoggerModule : IHttpModule
    { ... }

https://docs.Microsoft.com/en-us/dotnet/api/system.web.httpapplication.registermodule?view=netframework-4.7.2

3
Jesse

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 ... );
  }
}
1
Peter Morris