47

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

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

4

5 に答える 5

54

これは、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 のブログより

于 2008-10-27T14:40:53.447 に答える
29

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

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

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

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

于 2010-07-01T14:32:25.367 に答える
13

dll Microsoft.Web.Infrastructure.dll には、クラス DynamicModuleUtility 内にこのためのメソッドがあります。dll は WebPages 1.0 に同梱されています

public static class PreApplicationStartCode
{
    private static bool _startWasCalled;

    public static void Start()
    {
        if (_startWasCalled) return;

        _startWasCalled = true;
        DynamicModuleUtility.RegisterModule(typeof(EventTriggeringHttpModule));
    }
}
于 2010-11-26T13:52:31.163 に答える
2

ASP MVC の新しいバージョンでは、Package Manager を使用して 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 ... );
  }
}
于 2016-12-09T10:48:57.603 に答える