2015-08-28 32 views
5

Tworzę moduł HTTP, który może być ponownie użyty kilka razy, ale z innymi parametrami. Pomyślmy jako przykład, moduł przekierowania żądania. Mógłbym używać HTTPHandler, ale nie jest to dla niego zadaniem, ponieważ mój proces musi działać na poziomie żądania, a nie na poziomie rozszerzenia/ścieżki.Uzyskaj własne parametry HTTPModule w web.config?

Anyways, chciałbym mieć moje web.config w ten sposób:

<system.webServer> 
    <modules> 
     <add name="tpl01" type="TemplateModule" arg1="~/" arg2="500" />  
     <add name="tpl02" type="TemplateModule" arg1="~/" arg2="100" />  
    </modules> 
</system.webServer> 

Ale większość informacji udało mi się znaleźć była this. Mówię, tak, mogę uzyskać cały tag <modules>, ale w jaki sposób każda instancja mojego modułu HTTP wie, które argumenty podjąć? Gdybym mógł uzyskać nazwę (tpl01 lub tpl02) podczas tworzenia, mógłbym później sprawdzić jej argumenty po nazwie, ale nie widziałem żadnej właściwości w klasie HTTPModule, aby to uzyskać.

Każda pomoc będzie naprawdę mile widziane. Z góry dziękuję! :)

+0

HttpModuleCollection ma właściwość AllKeys. Dla każdego klucza możesz pobrać (klucz) i sprawdzić, czy powrót jest równy modułowi temu, aby określić nazwę twojego modułu. –

Odpowiedz

-1

To może być obejście problemu.

Najpierw zdefiniuj moduł z polami za to, co trzeba ustawić z zewnątrz:

public class TemplateModule : IHttpModule 
{ 
    protected static string _arg1; 
    protected static string _arg2; 

    public void Init(HttpApplication context) 
    { 
     _arg1 = "~/"; 
     _arg2 = "0"; 

     context.BeginRequest += new EventHandler(ContextBeginRequest); 
    } 

    // ... 
} 

Następnie z aplikacją internetową, za każdym razem trzeba użyć modułu z innym zestawem tych wartości, dziedziczą moduł i zastępują pola:

public class TemplateModule01 : Your.NS.TemplateModule 
{ 
    protected override void ContextBeginRequest(object sender, EventArgs e) 
    { 
     _arg1 = "~/something"; 
     _arg2 = "500"; 

     base.ContextBeginRequest(sender, e); 
    } 
} 

public class TemplateModule02 : Your.NS.TemplateModule 
{ 
    protected override void ContextBeginRequest(object sender, EventArgs e) 
    { 
     _arg1 = "~/otherthing"; 
     _arg2 = "100"; 

     base.ContextBeginRequest(sender, e); 
    } 
} 
+0

To jest po prostu straszny błąd wyścigowy, który czeka na zdarzenie. Utwórz nową metodę wirtualną w klasie bazowej i wywołaj ją za pomocą różnych argumentów z klas potomnych. Nie * używaj * statycznych pól do przekazywania argumentów, to jest głupie. –

2

Myślę, że ta część config (system.webServer \ modules \ add) nie jest przeznaczona do przekazywania (przechowywania) parametrów do modułów, ale do rejestrowania listy modułów do przetworzenia zapytania.

Dla możliwych atttributes w „Dodaj” elementu See - https://msdn.microsoft.com/en-us/library/ms690693(v=vs.90).aspx