2012-02-09 11 views
5

Ho creato una piccola libreria di classi, con un HttpModule che utilizza un filtro per aggiungere un po 'di html a ogni pagina richiesta servita da IIS7.Modulo registrato in IIS7 doens't work

L'ho provato prima registrando il modulo in web.config in un sito Web di prova e funziona come dovrebbe, ma solo in quella applicazione.

Ho generato una dll e creato un assembly con nome sicuro.

In qualche modo ho bisogno di aggiungere questo assembly come modulo in IIS a livello di server, in modo che funzioni per tutte le richieste, su tutte le applicazioni e anche per i contenuti non-asp.net.

Finora, ho provato ad aggiungere il dll come modulo nativo. Questo non funziona. È nella lista dei moduli nativi, ma non funziona.

Ho installato il dll nel GAC.

Leggendo su, sembra che devo aggiungere l'assembly come modulo gestito, quindi selezionarlo nell'elenco a discesa sotto "aggiungi modulo gestito" in IIS.

Per questo, ho provato ad utilizzare lo strumento a riga di comando appcmd, scrivendo: "Aggiungi modulo/nome: string/Tipo: stringa/Presupposto: stringa"

ho avuto alcun successo facendo questo, dal momento che puo' t capire cosa impostare come tipo e precondizione.

Come ho letto, i moduli registrati in IIS dovrebbero funzionare per tutte le applicazioni in tutti i siti e tutte le richieste.

Il punto è evitare di dover registrare il modulo in ogni file web.config di applicazioni.

Qualche idea?

+0

http://learn.iis.net/page.aspx/244/how-to-take-advantage-of-the-iis-integrated-pipeline/ –

+0

Ho modificato la mia risposta con ulteriore aiuto su come utilizzare comando appcmd. Non aggiungerlo come modulo nativo, se si ha difficoltà con la riga di comando, utilizzare Gestione IIS per aggiungere ** Modulo gestito **, come fare nella mia risposta. – Tomek

risposta

6

Dopo aver lavorato per un po ', sono riuscito a farlo funzionare.

L'installazione dell'assieme nel .net 4.0 GAC non lo renderà disponibile nell'elenco a discesa Tipo in Gestione Aggiungi modulo gestito.

Quello che ho dovuto fare è stato:

Creare il .NET 4.0 Class Library, e compilarlo come un assembly con nome

installarlo in .NET 4.0 GAC utilizzando il gacutil, situato in Programmi (x86) \ Microsoft SDK \ Windows \ v7.0A \ bin \ netfx 4.0 Strumenti

(o fare Visual Studio compilare, firmare e installare il gruppo automaticamente)

Aggiungi questa linea sotto <modules> in applicationHost. config: (si h come deve essere fatto manualmente, non può essere fatto nel manager)

<add name="MyName" type="NameSpace.ClassName" preCondition="managedHandler,runtimeVersionv4.0" /> 

Questo fa girare il modulo su richieste ai siti sviluppati in .net 4.

Sembra, tuttavia, che le richieste di i siti sviluppati nelle versioni pre .net 4 non possono utilizzare un modulo creato in .net 4.0. Quindi se fai richieste per pagine in un sito creato in .net 3.5, il modulo non funzionerà.

Un'altra osservazione:

Dopo aver aggiunto il modulo a IIS tramite il file applicationHost.config, se si apre il responsabile di IIS, evidenziare il nomeserver nelle connessioni e fare clic su moduli. Verrà visualizzato il modulo .net 4 nell'elenco.

Fare doppio clic su di esso per visualizzare le relative impostazioni. Vedrai che "Richiama solo per richieste ad ASP.La casella di controllo NET Applications o Managed Handlers è spuntata.Se si deseleziona e si preme ok, si otterrà un errore che dice che l'assembly non è stato installato nel GAC

Ma non l'ho appena installato con successo in .net 4 GAC? E non ho appena visto il modulo eseguito in una richiesta?

Se si va avanti e si salvano comunque le impostazioni, si ottiene un errore di runtime, e se si guarda in applicationHost.config , vedrai che le impostazioni del modulo aggiunte in precedenza sono cambiate.

Ma cosa succede se desidero "Richiamare solo per richieste ad applicazioni ASP.NET o gestori gestiti?

+0

Grazie, Soeren, è stato di grande aiuto leggere la tua domanda e le risposte che hai messo qui da te. Ho una domanda sui prossimi passi. Come metteresti un file di configurazione per il tuo modulo? (poiché è in esecuzione senza un'applicazione specifica). Voglio dire, qual è il modo standard per mettere un qualche tipo di file di configurazione per un modulo simile a un server? – Bakhshi

+0

Ciao, mi sembra utile, ma dov'è questo file dell'applicazione? Config di cui stai parlando ... Anch'io sto affrontando un problema simile ... – SutharMonil

2

È necessario aggiungere un modulo a livello di server. Si può fare da linea di comando:

appcmd add module /name:string /type:string /preCondition:string 

Per ottenere risultati sulla riga di comando eseguire: appcmd add module /?
In breve, deve apparire come:

appcmd add module /name:AnyNameOfYourChoice /type:YourClassNameSpace.YourClassName 

/preContition parametro è opzionale.

Maggiori dettagli here.

O

farlo da Gestione IIS andando nodo server -> Moduli -> Aggiungi modulo Managed
Maggiori dettagli here. (parte inferiore della pagina)

+0

Grazie. Come hai notato, ho modificato la mia domanda un paio di volte perché volevo essere il più specifico possibile. Proverò i tuoi suggerimenti e tornerò. – Soeren

+0

L'assembly viene ora aggiunto come modulo gestito e ora viene visualizzato un errore che dice: "System.Web.HttpException: Impossibile caricare il tipo ..." che suggerisce che la DLL non può essere trovata. La dll deve essere posizionata in un luogo specifico? L'ho copiato nella cartella "inetsrv". L'assembly viene installato anche in GAC. – Soeren

+0

Puoi provare ad aggiungerlo tramite IIS Manager? – Tomek

5

Ora sono in grado di eseguire il modulo su ogni richiesta. Il motivo per cui non funzionava prima era un errore totalmente non correlato da parte mia. Così, i passaggi necessari per farlo funzionare è:

  1. scrivere il codice che si desidera eseguire su ogni richiesta, come .net 3.5 Libreria di classi.
  2. Compila come assembly con nome sicuro.
  3. Installare l'assembly nel GAC.
  4. In Gestione IIS7, selezionare il nome del server nelle connessioni, fare clic su Moduli, fare clic su "Aggiungi modulo gestito" nelle azioni.
  5. scrivere un nome per il modulo e scegliere l'assembly appena installato nel menu a discesa dei tipi.
  6. Assicurarsi che il sito utilizzi un pool di applicazioni in esecuzione in modalità integrata.

Ovviamente, non è sempre una buona idea lasciare che tutto il codice venga eseguito su tutte le richieste, quindi potrebbe essere necessario filtrare alcuni dei file richiesti.

Una domanda rimane però!

Ora ci sono due GAC, Microsoft.NET per .net 4.0 e Windows GAC per pre .net 4.0. Poiché ho creato il mio assembly in .net 3.5, è stato installato nel GAC di Windows e quindi era disponibile nell'elenco a discesa del tipo in Gestione IIS.

Quando ho creato il mio assembly in .net 4.0, è stato installato nel GAC Microsoft.NET e, di conseguenza, NON era disponibile nell'elenco a discesa del tipo nel gestore IIS.

La domanda è: come si aggiunge un assembly .net 4.0 come modulo gestito in IIS7 e si esegue come il mio modulo gestito 3.5?

Questo deve essere possibile, giusto?

+0

La versione di IIS Manager fornita con IIS 7 è stata creata su .NET 3.5. Quindi, non sarebbe in grado di caricare nulla da .NET 4 GAC. –