Esempio di estendibilità end-to-end per sviluppatori IIS 7.0

di Saad Ladki

IIS 7 e versioni successive sono compilati con un'architettura completamente modulare, oltre alle API di estendibilità avanzate. In questo modo gli sviluppatori possono aggiungere, rimuovere e sostituire facilmente i componenti IIS predefiniti con quelli creati a mano, specificamente adatti per qualsiasi sito Web specifico. Non è mai stato così facile integrare codice nella pipeline fondamentale di IIS ed estendere IIS in modi che prima erano impossibili.

Per fornire alcuni esempi: alcune righe di codice consentono agli sviluppatori di scrivere moduli o gestori che forniscono nuovi schemi di autenticazione e autorizzazione, eseguire l'analisi in fase di esecuzione o l'analisi della sicurezza delle richieste in ingresso ed esaminare le risposte. Tuttavia, per fornire un valore aggiunto reale, questi moduli devono essere gestibili tramite interfacce di programmazione, strumenti da riga di comando e un'interfaccia utente.

Questo white paper è un esempio end-to-end di come estendere il server Web IIS con un gestore di richieste personalizzato. Illustra come aggiungere l'API e il supporto della riga di comando per la configurazione di questo gestore e come scrivere un modulo dell'interfaccia utente che si collega all'interfaccia di gestione IIS.

La soluzione è stata testata in Windows Vista e Windows Server® 2008 Beta 3. Verrà aggiornato una volta disponibile la versione finale di Windows Server 2008.

Set di funzionalità

  • Il gestore gestito inserisce un messaggio di copyright nei file di immagine
  • La funzionalità dei messaggi di copyright è basata sulla configurazione e usa il nuovo sistema di configurazione IIS
  • La configurazione può essere schematizzata e resa accessibile alle API di configurazione, agli script WMI e agli strumenti da riga di comando IIS
  • Il modulo di estensione dell'interfaccia utente consente la configurazione della funzionalità dei messaggi di copyright tramite l'interfaccia utente iis

Prerequisiti

Per seguire la procedura descritta in questo documento, è necessario installare il software seguente:

ASP.NET

Installare ASP.NET tramite il Pannello di controllo di Windows Vista. Selezionare "Programmi" - "Attiva o disattiva funzionalità di Windows". Aprire quindi "Internet Information Services" - "World Wide Web Services" - Funzionalità di sviluppo di applicazioni" e selezionare "ASP.NET.

Se si dispone di una build di Windows Server 2008. aprire "Server Manager" - "Gestisci ruoli" e selezionare "Server Web (IIS)". Fare clic su "Aggiungi servizi ruolo". In "Sviluppo di applicazioni" selezionare "ASP.NET".

È inoltre necessario installare "Script e strumenti di gestione IIS" per sfruttare l'estendibilità WMI in IIS. A tale scopo, selezionare "Programmi" - "Attiva o disattiva funzionalità di Windows". Aprire quindi "Internet Information Services" - "Strumenti di gestione Web" e selezionare " Script e strumenti di gestione IIS".

Se si dispone di una build di Windows Server 2008, aprire "Server Manager" - "Ruoli" e selezionare "Server Web (IIS)". Fare clic su "Aggiungi servizi del ruolo". In "Strumenti di gestione Web" selezionare " Script e strumenti di gestione IIS ".

Visual C# Express Edition o Visual Studio 2005

Per il modulo interfaccia utente è necessario uno strumento di sviluppo C#. Se non si dispone di una copia di Visual Studio 2005, scaricare Visual Studio gratuitamente.

Gestione dei problemi di controllo dell'account utente

Protezione dell'account utente di Windows Vista rimuove i privilegi di amministratore dal token di accesso. Per impostazione predefinita, non sarà possibile accedere alle posizioni di configurazione e contenuto di IIS. Per risolvere questo problema, è consigliabile eseguire questo articolo usando un prompt dei comandi con privilegi elevati.

Per avviare un prompt dei comandi con privilegi elevati, passare al menu "Start", fare clic su "Tutti i programmi" - "Accessori". Fare clic con il pulsante destro del mouse su "Prompt dei comandi" e scegliere "Esegui come amministratore". Confermare la richiesta di elevazione.

Scenario

L'esempio seguente decora in modo dinamico le immagini servite dal server Web con informazioni sul copyright nell'angolo inferiore sinistro, come illustrato nella figura 1.

Screenshot della pagina Web che mostra un'immagine di montagne rocciose ricoperte di neve sullo sfondo di un cielo nuvoloso.
Figura 1: Modulo copyright immagine in azione

Usiamo il codice gestito per lo sviluppo del gestore che decora le immagini. Come parte dell'esempio, si specifica anche la configurazione per questo gestore e la si archivia nell'archivio di configurazione IIS. Infine, si svilupperà un plug-in interfaccia utente per Gestione IIS.

L'archivio di configurazione IIS può essere esteso semplicemente copiando un file di schema nella directory dello schema IIS. Lo schema dichiara il nome della nuova sezione di configurazione e i relativi attributi, tipi e valori predefiniti. Per questo esempio viene dichiarata una nuova sezione di configurazione denominata imageCopyright. Si trova all'interno del gruppo di configurazione system.webServer. Le relative proprietà sono:

  • Flag di tipo booleano che abilita o disabilita la funzionalità di imageCopyright
  • Attributo stringa contenente il messaggio di copyright
  • Attributo color che specifica il colore del messaggio di copyright

Dichiarazione dello schema

Salvare la definizione dello schema seguente come imagecopyright.xml in %windir%\system32\inetsrv\config\schema:

<configSchema>
    <sectionSchema name="system.webServer/imageCopyright">
        <attribute name="enabled" type="bool" defaultValue="false" />
        <attribute name="message" type="string" defaultValue="Your Copyright Message" />
        <attribute name="color" type="string" defaultValue="Red"/> 
   </sectionSchema>
</configSchema>

Se viene visualizzato un messaggio di accesso negato, questa operazione non è stata eseguita dal prompt dei comandi con privilegi elevati. Dopo aver aggiunto il file di schema, lo schema deve essere dichiarato nel file applicationhost.config. Aggiungere il codice XML seguente a %windir%\system32\inetsrv\config\applicationhost.config

<configSections>
...
<sectionGroup name="system.webServer">
<section name="imageCopyright"  overrideModeDefault="Allow"/>
...    
</sectionGroup>
</configSections>

Configuralo

Il processo è completo. È possibile impostare le nuove impostazioni di configurazione tramite la riga di comando o direttamente all'interno di applicationhost.config o web.config. Provalo. Aprire una console dei comandi e inserire quanto segue:

<system.webServer>
    <imageCopyright />
</system.webServer>

L'output mostra che la sezione di configurazione è stata riconosciuta, con la configurazione predefinita:

%windir%\system32\inetsrv\appcmd set config -section:system.webServer/imageCopyright 

/color:yellow /message:"Copyright (C) Contoso.COM" /enabled:true

Aggiungere ora le impostazioni di configurazione tramite appcmd.exe, ad esempio

%windir%\system32\inetsrv\appcmd set config -section:system.webServer/imageCopyright 

/color:yellow /message:"Copyright (C) Contoso.COM" /enabled:true

Verificare se la configurazione è stata salvata eseguendo:

%windir%\system32\inetsrv\appcmd list config -section:system.webServer/imageCopyright

Vedere la configurazione salvata:

<system.webServer> 
    <imageCopyright enabled="true" message="Copyright (C) Contoso.COM" color="yellow" />
</system.webServer>

Rendere scriptabile la configurazione di imageCopyright

Annotazioni

Rendere disponibile la configurazione del gestore imageCopyright per gli script WMI è facoltativa. È possibile passare direttamente a "Passaggio 2 - Estendibilità principale: Gestore copyright immagine" senza influire sui passaggi rimanenti.

Per rendere disponibile la configurazione del gestore imageCopyright per gli script WMI, completare la procedura seguente:

  • Installazione del supporto WMI di IIS
  • Creazione del file imageCopyright.mof
  • Inclusione del file imageCopyright.mof in webadministration.mof e compilazione dei file di schema WMI
  • Scrittura ed esecuzione dello script

Installazione del supporto WMI di IIS

L'installazione predefinita di IIS non include i componenti di scripting WMI. È necessario aggiungerli.

Installazione del supporto per WMI nelle versioni client di Vista

Installare "Iis Management Scripts and Tools" tramite il Pannello di controllo di Windows Vista. Selezionare "Programmi" - "Attiva o disattiva funzionalità di Windows". Aprire quindi "Internet Information Services" - "Strumenti di gestione Web" e selezionare "Iis Management Scripts and Tools".

Installazione del supporto WMI in SKU di Windows Server 2008

Se si dispone di una build di Windows Server 2008, aprire "Server Manager" - "Ruoli" e selezionare "Server Web (IIS)". Fare clic su "Aggiungi servizi del ruolo". In "Strumenti di gestione" selezionare "Script e strumenti di gestione IIS".

Creazione del file imageCopyright.mof

La dichiarazione dello schema delle proprietà WMI è molto simile alla dichiarazione dello schema delle proprietà IIS nel passaggio precedente. Gli schemi WMI vengono dichiarati nei file mof e vengono compilati da uno strumento denominato mofcomp. Mofcomp aggiunge la dichiarazione dello schema al repository WMI.

Attività per aggiungere le informazioni sullo schema

Aprire un'istanza del Blocco note e copiarne le righe seguenti:

#pragma AUTORECOVER
#pragma namespace("\\\\.\\Root\\WebAdministration")
[            
    dynamic : ToInstance ToSubClass,
    provider("WebAdministrationProvider") : ToInstance ToSubClass,
    Description("imageCopyright Section") : ToSubClass,
    Locale(1033) : ToInstance ToSubClass,
    factory_clsid("{901a70b2-0f7a-44ea-b97b-1e9299dec8ca}"),
    section_path("system.webServer/imageCopyright"),
    SupportsUpdate
]
 
class imageCopyright : ConfigurationSection
{      
    [
        read: ToSubClass ToInstance,
        write: ToSubClass ToInstance,
        DefaultValue("False"): ToSubClass ToInstance,
        Description("To be written"): ToSubClass ToInstance
    ]
    boolean Enabled;
  
    [
        read: ToSubClass ToInstance,
        write: ToSubClass ToInstance,
        DefaultValue("Your Copyright Message"): ToSubClass ToInstance,
        Description("Copyright Message"): ToSubClass ToInstance
    ]
    string Message;

    [
        read: ToSubClass ToInstance,
        write: ToSubClass ToInstance,
        DefaultValue("Yellow"): ToSubClass ToInstance,
        Description("Color of Copyright Message"): ToSubClass ToInstance
    ]
    string Color;
};

La dichiarazione dello schema contiene le stesse voci di imageCopyright.xml nel passaggio precedente, ovvero il nome e il tipo dell'impostazione di configurazione e il relativo valore predefinito. Salvare il file come %windir%\system32\inetsrv\imageCopyright.mof.

Compilazione di file di schema WMI

Compilare imageCopyright.mof eseguendo il comando seguente

mofcomp webadministration.mof

The WMI Script

Mofcomp ha aggiunto lo schema imageCopyright al repository WMI. Impostare le impostazioni di configurazione di IIS eseguendo lo script del provider WMI IIS. Ecco un esempio:

Attività

Aprire un'istanza di BLOCCO NOTE e copiarne le righe seguenti. Salvare il file come SetCopyrightConfig.vbs:

Set oIIS = GetObject("winmgmts:root\WebAdministration")        
Set oSection = oIIS.Get("ImageCopyright.Path='MACHINE/WEBROOT/APPHOST/Default Web Site',Location=''")
oSection.Enabled = true
oSection.Message = "Copyright (C) IIS7 Team - Date: " & date
oSection.Color = "White"
oSection.Put_

Si tratta di uno script WMI standard che si connette al provider WMI IIS. Ottiene la sezione di configurazione nel percorso specificato ("Sito Web predefinito") e ne modifica i valori. La chiamata Put_ salverà le modifiche apportate al disco.

Se si esegue lo script, aggiunge il messaggio di copyright con la data corrente in %systemdrive%\inetpub\wwwroot\web.config. Dai un'occhiata.

Aggiungere quindi il gestore del copyright dell'immagine stesso.

Un gestore è una parte di codice che viene eseguita quando la richiesta corrisponde a un determinato modello, in genere un'estensione di file. Richieste che terminano con .ASP sono mappate a ASP.DLL, ad esempio. In IIS 6.0 è stato necessario scrivere un'estensione ISAPI per gestire le richieste con determinate estensioni di file. ASP.NET ha anche consentito la gestione delle estensioni di file, ma solo se la richiesta è stata mappata a ASP.NET in precedenza. In IIS è possibile gestire estensioni di file arbitrarie senza coinvolgere ASP.NET. In questo esempio vengono gestite le richieste con l'estensione .JPG. Ecco come eseguire questa operazione:

Creazione della directory dei contenuti

Creare una directory di contenuto, ad esempio c:\inetpub\mypictures, e copiare alcune immagini digitali desiderate. Assicurarsi che questi file siano file di immagine con l'estensione .JPG.

Annotazioni

Per motivi di semplicità, gli esempi di codice illustrati qui non includono il codice di gestione degli errori per i file che non sono file di immagine.

Creare una sottodirectory denominata App_Code sotto la nuova directory, c:\inetpub\mypictures\App\_Codead esempio .

Creare l'applicazione mypictures

È possibile creare un'applicazione che punti a c:\inetpub\mypictures tramite la console di gestione IIS, ma esistono modi più interessanti per farlo. Creare una nuova applicazione tramite appcmd. Il comando seguente crea un'app denominata "mypictures" nel "Sito Web predefinito" con il percorso c:\inetpub\mypicturesfisico :

%windir%\system32\inetsrv\appcmd add app -site.name:"Default Web Site"

-path:/mypictures -physicalPath:%systemdrive%\inetpub\mypictures

Poiché si vogliono visualizzare i file JPG copiati in questa directory, abilitare l'esplorazione della directory. Eseguire questa operazione tramite la Console di gestione IIS o ricorrere a un metodo più interessante e usare appcmd. Ecco come impostare l'esplorazione della directory su true tramite appcmd:

%windir%\system32\inetsrv\appcmd set config "Default Web Site/mypictures"

 -section:directoryBrowse -enabled:true

Se richiedi http://localhost/mypictures, viene visualizzato un elenco di directory con le tue immagini.

Tempo di scrittura del codice

Scrivere ora il codice di gestione delle immagini effettivo. Scrivere alcune righe di codice C# e ottenere il risultato: usare il codice seguente come riferimento e salvarlo come imagecopyrighthandler.cs nella directory App_Code, ad esempio c:\inetpub\mypictures\App\_Code\imagecopyrighthandler.cs.

#region Using directives
using System;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using Microsoft.Web.Administration;
#endregion
  
namespace IIS7Demos
{
    public class imageCopyrightHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            ConfigurationSection imageCopyrightHandlerSection = 
                WebConfigurationManager.GetSection("system.webServer/imageCopyright");
  
            HandleImage(    context,
                            (bool)imageCopyrightHandlerSection.Attributes["enabled"].Value,
                            (string)imageCopyrightHandlerSection.Attributes["message"].Value,
                            (string)imageCopyrightHandlerSection.Attributes["color"].Value                            
                        );
        }
  
        void HandleImage(   HttpContext context,
                            bool enabled,
                            string copyrightText,
                            string color
                        )           
        {
            try
            {
                string strPath = context.Request.PhysicalPath;
                if (enabled)
                {
                    Bitmap bitmap = new Bitmap(strPath);
                    // add copyright message
                    Graphics g = Graphics.FromImage(bitmap);
                    Font f = new Font("Arial", 50, GraphicsUnit.Pixel);
                    SolidBrush sb = new SolidBrush(Color.FromName(color));
                    g.DrawString(   copyrightText,
                                    f,
                                    sb,
                                    5,
                                    bitmap.Height - f.Height - 5
                                );
                    f.Dispose();
                    g.Dispose();
                    // slow, but good looking resize for large images
                    context.Response.ContentType = "image/jpeg";
                    bitmap.Save(
                                        context.Response.OutputStream,
                                        System.Drawing.Imaging.ImageFormat.Jpeg
                                     );
                    bitmap.Dispose();
                }
                else
                {
                    context.Response.WriteFile(strPath);
                }
            }
            catch (Exception e)
            {
                context.Response.Write(e.Message);
            }
        }
  
        public bool IsReusable
        {
            get { return true; }
        }
    }
}

Il codice precedente esegue le operazioni seguenti:

  • Legge la configurazione
  • Chiama HandleImage

HandleImage esegue le operazioni seguenti:

  • Crea un oggetto Graphics dalla bitmap
  • Crea un oggetto carattere usando i valori configurati
  • Disegna il messaggio nella bitmap

Per usare la classe Microsoft.Web.Administration, è necessario aggiungere il riferimento all'assembly dell'API Amministrazione IIS. A tale scopo, aprire %systemdrive%\inetpub\mypictures\web.config e aggiungere le voci seguenti:

<system.web>
    <compilation>
      <assemblies>
        <add assembly="Microsoft.Web.Administration, Version=7.0.0.0, 
Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"/>
      </assemblies>
    </compilation>
</system.web>

È anche possibile compilare il gestore in un assembly e inserirlo in mypictures/bin. In questo caso, non è necessario aggiungere l'assembly Microsoft.Web.Administration al file di web.config.

Configurazione del gestore

È necessario indicare a IIS di richiamare il nuovo gestore solo se è richiesto un file .JPG. Eseguire questa operazione tramite la Console di gestione IIS oppure si usa appcmd:

appcmd set config "Default Web Site/mypictures/" -section:handlers 

/+[name='JPG-imageCopyrightHandler',path='*.jpg',verb='GET',type='IIS7Demos.imageCopyrightHandler']

Il comando appcmd precedente configura il nuovo gestore solo nella directory /mypictures. Poiché le voci del gestore si trovano in una raccolta, è necessario usare la sintassi +[]. Questa sintassi viene sempre utilizzata quando è necessario aggiungere elementi alle raccolte. Gli elementi della configurazione del gestore sono:

nome

Può essere qualsiasi nome univoco. Il nome viene usato solo per identificare in modo univoco il gestore.

percorso

Indica a IIS quando eseguire questo gestore. *.JPG indica a IIS di eseguire questo gestore per tutti i file che terminano in .JPG. Se si usa foo*.JPG come percorso, solo i file JPG che iniziano con foo vengono eseguiti da questo gestore.

verbo

Elenco di verbi HTTP separati da virgole che devono corrispondere per eseguire questo gestore. In questo caso, si vuole eseguire la richiesta solo quando arriva una richiesta GET.

type

Tipo gestito della classe che deve essere eseguita quando la richiesta corrisponde. È costituito dallo spazio dei nomi e dalla classe derivata IHttpHandler nella directory App_Code.

Un'ultima nota

Prima di iniziare a testare le immagini protette da copyright, assicurarsi che il processo di lavoro IIS che esegue la richiesta rilevi le modifiche apportate allo schema. È possibile che il processo di lavoro sia già in esecuzione quando è stato aggiunto il file imageCopyright.xml alla directory dello schema. In questo caso, si verifica un'eccezione di configurazione in imagecopyrightconfig.cs. L'autore ha riscontrato questo problema mentre scriveva questo articolo ed è costato all'autore molto tempo.

Il semplice riciclo del pool di applicazioni risolve questo problema:

appcmd recycle AppPool DefaultAppPool

Il processo è completo. Se si richiede http://localhost/mypictures/<imageOfYourChoice>.jpg)ora , viene visualizzato il messaggio sul copyright.

Opzioni:

  • È possibile modificare le opzioni del messaggio di copyright tramite appcmd o modificando direttamente il file web.config
  • È possibile eseguire il mapping del gestore imageCopyright ad altri tipi di immagine, e.g. BMP o GIF aggiungendo lo stesso gestore per un'estensione diversa. Esempio:
appcmd set config "Default Web Site/mypictures/" -section:handlers /+[name='BMP-imageCopyrightHandler',path='*.bmp',verb='GET',type='IIS7Demos.imageCopyrightHandler']

Tempo per il tocco finale. Abbiamo già esteso il server principale di IIS con alcune righe di codice; il sistema di configurazione di IIS è stato esteso senza bisogno di codice e abbiamo ottenuto il supporto della riga di comando automaticamente. A questo punto, per configurare il gestore imageCopyright tramite la Console di gestione IIS.

Questa operazione viene eseguita tramite le attività seguenti:

  • Creazione del progetto in Microsoft Visual Studio o Microsoft Visual C# Express in modo che l'assembly possa essere usato all'interno della Console di gestione IIS
  • Creazione di un provider di moduli
  • Creazione di un modulo che legge e imposta le proprietà imageCopyright.

Creazione del progetto

Per creare un modulo di estendibilità per InetMgr, è necessario creare un progetto DLL noto anche come progetto libreria di classi. Questa DLL deve essere denominata in modo sicuro in modo che possa essere registrata nella GAC (Global Assembly Cache) che è un requisito per i moduli usati da IIS Management Console.

Gradi

  1. Fare clic su Start, fare clic su Programmi ed eseguire Microsoft Visual Studio 2005 o Microsoft Visual C# 2005 Express Edition.

  2. Nel menu File selezionare l'opzione Nuovo progetto.

  3. Nella finestra di dialogo Nuovo progetto selezionare Libreria di classi come tipo di progetto e digitare imageCopyrightUI come nome del progetto e fare clic su OK.

    Screenshot della finestra di dialogo Nuovo progetto con Libreria di Classi selezionata e l'immagine Copyright U immessa nel campo Nome come nome del progetto.
    Figura 2: Finestra di dialogo Nuovo progetto

  4. Rimuovere il file Class1.cs aggiunto per impostazione predefinita perché non verrà usato.

  5. Usando l'opzione Aggiungi nuovo riferimento dal menu Progetto, aggiungere un riferimento a Microsoft.Web.Management.dll che si trova nella directory \Windows\system32\inetsrv. Si tratta della DLL che contiene tutte le classi di estendibilità necessarie per la creazione di moduli per la Console di gestione IIS.

  6. Usando l'opzione Aggiungi nuovo riferimento dal menu Progetto, aggiungere un riferimento a Microsoft.Web.Administration.dll che si trova nella directory \Windows\system32\inetsrv. Si tratta della DLL che contiene tutte le classi di configurazione necessarie per leggere e scrivere la configurazione di IIS.

  7. Poiché useremo il codice per creare l'interfaccia utente basata su WinForms, vogliamo anche aggiungere un riferimento a System.Windows.Forms.dll; usando di nuovo l'opzione "Aggiungi Nuovo Riferimento" dal menu Progetto, selezionare System.Windows.Forms.dll e System.Web.dll nell'elenco di assembly .NET.

  8. Uno dei requisiti per le librerie da usare all'interno di InetMgr è che devono essere registrati all'interno della GAC. Per questo, è necessario assicurarsi che la nostra DLL sia firmata con un nome forte (talvolta indicato come 'Signed'). Visual Studio offre un modo semplice per creare nuovi nomi e selezionarne uno per il progetto. Quindi, usando il menu Progetto, selezionare l'opzione Proprietà ImageCopyrightUI.

  9. Nella scheda Firma, selezionare l'opzione di firma dell'assembly.

  10. Nella finestra di dialogo Crea chiave con nome sicuro, digitare imageCopyrightUI come nome per la chiave e deselezionare la casella Proteggi il file di chiave con una password. Fare clic su OK.

    Screenshot della finestra di dialogo Crea chiave con nome sicuro che mostra l'immagine Copyright U immessa come Nome file chiave e password creata e confermata.
    Figura 3: Finestra di dialogo Crea nome sicuro

    La scheda di firma visualizza:

    Screenshot della scheda
    Figura 4: Scheda Firma progetto VS

  11. Poiché si vuole che l'assembly sia nella GAC, verranno aggiunti alcuni eventi post-compilazione in modo che venga aggiunto automaticamente alla GAC ogni volta che si compila. In questo modo sarà possibile eseguire il debug e apportare modifiche man mano che si aggiungono nuove funzionalità. A tale scopo, selezionare la scheda Eventi di compilazione e aggiungere la riga di comando dell'evento post-compilazione seguente:

    call "%VS80COMNTOOLS%\vsvars32.bat" > NULL
    
    gacutil.exe /if "$(TargetPath)"
    

    Screenshot della riga di comando Post Build Event popolata con il codice.
    Figura 5: Scheda Eventi Post-compilazione VS

    (Facoltativo) Se si usa Microsoft Visual Studio 2005 (non funzionerà con Visual C# Express Edition), configurare correttamente il debug per usare F5 per eseguire il codice. A tale scopo, passare alle proprietà del progetto, selezionare scheda Debug e impostarla per avviare un programma esterno scegliendo \windows\system32\inetsrv\inetmgr.exe

    Screenshot della scheda Debug impostata sull'azione Avvia programma esterno.
    Figura 6: Scheda di Debug

  12. Infine, chiudere le proprietà del progetto, selezionare l'opzione Salva tutto nel menu File e fare clic su OK.

    Ora compila il progetto usando Build Solution nel menu Compila. In questo modo viene compilata automaticamente la DLL e aggiunta alla GAC.

Creazione del provider di moduli

L'interfaccia utente iis è personalizzabile e modulare come il server principale IIS e il sistema di configurazione IIS. L'interfaccia utente iis è un set di moduli di funzionalità che possono essere rimossi o sostituiti. Il punto di ingresso per ogni modulo dell'interfaccia utente è un provider di moduli. Un elenco di tutti i provider di moduli è disponibile nella %windir%\system32\inetsrv\Administration.config<modules> sezione .

Come primo passaggio, creare il provider di moduli imageCopyrightUI.

Gradi

  1. Selezionare l'opzione Aggiungi nuovo elemento dal menu Progetto. Nella finestra di dialogo Aggiungi nuovo elemento selezionare il modello Classe e digitare imageCopyrightUIModuleProvider.cs come nome per il file.

    Screenshot della finestra di dialogo Aggiungi nuovo elemento con il modello di classe selezionato e il campo Nome popolato con l'immagine Copyright U I Module Provider dot c s.
    Figura 7: Finestra di dialogo Aggiungi nuovo elemento

  2. Modificare il codice in modo che abbia l'aspetto seguente:

    using System;
    using System.Security;
    using Microsoft.Web.Management.Server;
        
    namespace IIS7Demos           
    {
        class imageCopyrightUIProvider : ModuleProvider
        {
            public override Type ServiceType              
            {
                get { return null; }
            }
    
            public override ModuleDefinition GetModuleDefinition(IManagementContext context)
            {
                return new ModuleDefinition(Name, typeof(imageCopyrightUI).AssemblyQualifiedName);
            }
    
            public override bool SupportsScope(ManagementScope scope)
            {
                return true;
            }
        }            
    }
    

    Questo codice crea un ModuleProvider che supporta tutti i tipi di ambiti (Server, Sito e Applicazione) e registra un modulo lato client denominato imageCopyrightUI. Per visualizzare il modulo solo a livello di applicazione, la funzione SupportsScope è simile alla seguente:

    public override bool SupportsScope(ManagementScope scope)
    {
        return (scope == ManagementScope.Application) ;
    }
    

Creazione del modulo dell'interfaccia utente

Un modulo è il punto di ingresso principale nel client per tutti gli oggetti di estendibilità. Ha un metodo principale denominato Initialize. Questo è il metodo in cui viene eseguita tutta l'azione.

Gradi

  1. Selezionare l'opzione Aggiungi nuovo elemento nel menu Progetto.

  2. Selezionare il modello Classe e digitare imageCopyrightUI.cs come nome file. Modificare il codice in modo che abbia l'aspetto seguente:

    using System;
    using System.Windows.Forms;
    using Microsoft.Web.Management.Client;
    using Microsoft.Web.Management.Server;
    
    namespace IIS7Demos
    {
        internal class imageCopyrightUI : Module
        {
            protected override void Initialize(IServiceProvider serviceProvider, ModuleInfo moduleInfo)
            {
                base.Initialize(serviceProvider, moduleInfo);
                IControlPanel controlPanel = (IControlPanel)GetService(typeof(IControlPanel));
                ModulePageInfo modulePageInfo = new ModulePageInfo(this, typeof(imageCopyrightUIPage), "Image Copyright", "Image Copyright");
                controlPanel.RegisterPage(modulePageInfo);
            }
        }              
    }
    

    Nel codice precedente si specifica il testo della voce nell'elenco dei moduli dell'interfaccia utente e il tipo di una singola pagina da visualizzare quando un utente fa clic su questo testo.

Tutto ciò che rimane è scrivere la pagina stessa.

Creazione della pagina modulo

In questa attività viene creata la pagina del modulo più semplice. ModulePage è la classe di base fornita dal framework per creare una nuova interfaccia utente. Esistono quattro classi diverse fornite dal framework che sono utili, a seconda dello scenario che si sta tentando di compilare.

  • ModulePage. Questa classe di base offre solo i servizi di base e non offre alcuna interfaccia utente speciale. Nessuna delle funzionalità incluse in InetMgr deriva direttamente da questa classe.
  • ModuleDialogPage. Questa classe di base offre una semantica simile a quella di una finestra di dialogo, inclusi i collegamenti Applica e Annulla nell'elenco attività e offre metodi specifici di cui è possibile eseguire l'override per gestire queste attività comuni. Gestisce anche elementi come Refresh e altre funzioni automaticamente. Esempi di funzionalità che derivano da questa pagina includono La chiave del computer, il servizio di gestione e così via.
  • ModulePropertiesPage. Questa classe di base offre un'interfaccia utente simile alla griglia delle proprietà di Visual Studio in cui tutte le proprietà vengono visualizzate in un controllo gerarchico simile alla griglia. Esempi di questo tipo includono CGI, ASP, compilazione .NET e così via.
  • ModuleListPage. Questa classe di base è utile ogni volta che è necessario visualizzare un elenco di elementi. Include un controllo ListView che è possibile usare per visualizzare automaticamente le impostazioni e le offerte di ricerca, raggruppamento e visualizzazioni. Gli esempi includono impostazioni dell'applicazione, moduli, processi di lavoro e così via.

Gradi

  1. Selezionare l'opzione Aggiungi nuovo elemento dal menu Progetto.

  2. Nella finestra di dialogo Aggiungi nuovo elemento selezionare il modello Classe e digitare imageCopyrightUIPage.cs come nome per il file. Modificare il codice in modo che abbia l'aspetto seguente:

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using Microsoft.Web.Management.Client.Win32;
    using Microsoft.Web.Administration;
    using Microsoft.Web.Management.Client;
    using Microsoft.Web.Management.Server;
    namespace IIS7Demos
    {
        public sealed class imageCopyrightUIPage : ModulePage
        {
            public string message;
            public bool featureenabled;
            public string color;
    
            ComboBox _colCombo = new ComboBox();
            TextBox _msgTB = new TextBox();
            CheckBox _enabledCB = new CheckBox();
            public imageCopyrightUIPage()
            {
                this.Initialize();
            }
            protected override void OnActivated(bool initialActivation)
            {
               base.OnActivated(initialActivation);
               if (initialActivation)
               {
                    ReadConfig();
                    UpdateUI();
                }
            }
    
            void UpdateUI()
            {
                _enabledCB.Checked = featureenabled;
                int n = _colCombo.FindString(color, 0);
                _colCombo.SelectedIndex = n;
                _msgTB.Text = message;
            }
    
            void Initialize()
            {
                Label crlabel = new Label();
                crlabel.Left = 50;
                crlabel.Top = 100;
                crlabel.AutoSize = true;
                crlabel.Text = "Enable Image Copyright:";
                _enabledCB.Text = "";
                _enabledCB.Left = 200;
                _enabledCB.Top = 100;
                _enabledCB.AutoSize = true;
    
                Label msglabel = new Label();
                msglabel.Left = 150;
                msglabel.Top = 130;
                msglabel.AutoSize = true;
                msglabel.Text = "Message:";
                _msgTB.Left = 200;
                _msgTB.Top = 130;
                _msgTB.Width = 200;
                _msgTB.Height = 50;
    
                Label collabel = new Label();
                collabel.Left = 160;
                collabel.Top = 160;
                collabel.AutoSize = true;
                collabel.Text = "Color:";
                _colCombo.Left = 200;
                _colCombo.Top = 160;
                _colCombo.Width = 50;
                _colCombo.Height = 90;
                _colCombo.Items.Add((object)"Yellow");
                _colCombo.Items.Add((object)"Blue");
                _colCombo.Items.Add((object)"Red");
                _colCombo.Items.Add((object)"White");
    
                Button apply = new Button();
                apply.Text = "Apply";
                apply.Click += new EventHandler(this.applyClick);
                apply.Left = 200;
                apply.AutoSize = true;
                apply.Top = 250;
    
                Controls.Add(crlabel);
                Controls.Add(_enabledCB);
                Controls.Add(collabel);
                Controls.Add(_colCombo);
                Controls.Add(msglabel);
                Controls.Add(_msgTB);
                Controls.Add(apply);
            }
    
            private void applyClick(Object sender, EventArgs e)
            {
                try
                {
                    UpdateVariables();
                    ServerManager mgr;
                    ConfigurationSection section;
                    mgr = new ServerManager();
                    Configuration config =
                    mgr.GetWebConfiguration
                    (
                           Connection.ConfigurationPath.SiteName, 
                           Connection.ConfigurationPath.ApplicationPath +
                           Connection.ConfigurationPath.FolderPath
                    );
    
                section = config.GetSection("system.webServer/imageCopyright");
                section.GetAttribute("color").Value = (object)color;
                section.GetAttribute("message").Value = (object)message;
                section.GetAttribute("enabled").Value = (object)featureenabled;
    
                mgr.CommitChanges();
    
                }
    
                catch
                {}
    
            }
    
            public void UpdateVariables()
            {
                featureenabled = _enabledCB.Checked;
                color = _colCombo.Text;
                message = _msgTB.Text;
            }
    
            public void ReadConfig()
            {
                try
                {
                    ServerManager mgr;
                    ConfigurationSection section;
                    mgr = new ServerManager();
                    Configuration config =
                    mgr.GetWebConfiguration(
                           Connection.ConfigurationPath.SiteName,
                           Connection.ConfigurationPath.ApplicationPath +
                           Connection.ConfigurationPath.FolderPath);
    
                    section = config.GetSection("system.webServer/imageCopyright");
                    color = (string)section.GetAttribute("color").Value;
                    message = (string)section.GetAttribute("message").Value;
                    featureenabled = (bool)section.GetAttribute("enabled").Value;
    
                }
    
                catch
                {}
    
            }
        }
    }
    

    Anche se è presente molto, questo codice non fa altro che inserire un paio di controlli in ModulePage e legge e scrive nell'archivio di configurazione IIS.

Lettura della configurazione

La funzione ReadConfig usa le stesse interfacce Microsoft.Web.Administration per aprire l'archivio di configurazione IIS. L'interfaccia utente fornisce l'ambito in cui verranno applicate le impostazioni di configurazione.

Esempio:

Connection.ConfigurationPath.SiteName,

Connection.ConfigurationPath.ApplicationPath+

Connection.ConfigurationPath.FolderPath

Salvataggio della configurazione

La configurazione viene salvata quando si fa clic sul pulsante Applica (funzione applyClick). Le modifiche apportate nell'interfaccia utente si riflettono negli attributi della sezione e la sezione viene salvata su disco.

section.GetAttribute("enabled").Value = (object)featureenabled;

mgr.CommitChanges();

A questo punto, è possibile compilare di nuovo tutto usando "Compila soluzione" dal menu Compila. Questa operazione compila l'immagine dell'assembly CopyrightUI e la inserisce nella Global Assembly Cache.

Registrazione del modulo

Il modulo dell'interfaccia utente è compilato, ma è comunque necessario indicare a IIS Management Console di caricarlo. Eseguire questa operazione:

  • Recupero del nome sicuro del modulo dell'interfaccia utente dalla Global Assembly Cache
  • Aggiunta del nome sicuro e del tipo al file di configurazione di IIS Management Console. In questo modo la Console di gestione IIS caricherà il tipo all'avvio
  • Abilitazione del modulo nell'elenco dei moduli dell'interfaccia utente

Gradi

  1. Aprire o usare una shell dei comandi con privilegi elevati esistente e registrare le variabili di ambiente di Visual Studio 8.0 eseguendo il comando seguente:

    "%vs80comntools%\vsvars32.bat
    
  2. Eseguire GacUtil

    GACUTIL /l imageCopyrightUI
    
  3. Aprire %windir%\system32\inetsrv\config\administration.config e aggiungere il codice seguente subito dopo la <moduleProviders> voce:

    <add name="imageCopyrightUI" type="IIS7Demos.imageCopyrightUIProvider, IIS7Demos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3fd9bd5e992ee757"/>
    

Il risultato

L'attività è stata completata. Esaminare i risultati.

Aprire la Console di gestione IIS e passare all'applicazione /mypictures.

Fare doppio clic sulla voce "Copyright immagine".

Screenshot di IIS Management Console con l'applicazione le mie immagini selezionata e il messaggio di Copyright visualizzato.
Figura 8: Interfaccia utente per il copyright delle immagini

Modificare il messaggio di copyright, fare clic su Applica e aggiornare il browser. Messaggio di copyright modificato. Esaminare il file web.config nella %systemdrive%\inetpub\mypictures directory per visualizzare la configurazione modificata.

Sommario

IIS è estendibile in modi non possibili in precedenza. È possibile estendere la pipeline di elaborazione del nucleo di IIS con il proprio componente, archiviare la configurazione di questo componente insieme alla configurazione di IIS e persino scrivere un plug-in dell'interfaccia utente che si affianca alle impostazioni standard di IIS. Per esaminare le operazioni dell'esempio precedente:

Estendibilità di IIS Core

È stato aggiunto un gestore di immagini al core IIS che inserisce un messaggio di copyright in ogni .JPG file che viene gestito. Questa operazione è stata eseguita con poche righe di codice C#. La funzionalità del gestore è stata guidata dalla configurazione. La configurazione è stata archiviata nei normali file di configurazione IIS applicationhost.config e web.config. È stato anche aggiunto il supporto per la memorizzazione nella cache per le immagini.

Estendibilità del sistema di configurazione IIS

È stata aggiunta la configurazione del gestore del copyright dell'immagine al sistema di configurazione IIS. Vantaggi come un archivio xml e altamente leggibile, l'API istantanea e il supporto della riga di comando, la delega e le distribuzioni distribuite sono disponibili gratuitamente. Non è stato necessario scrivere una singola riga di codice.

Estendibilità dell'interfaccia utente iis

Per offrire alla funzionalità la visibilità che merita, è stato aggiunto un modulo dell'interfaccia utente IIS. Anche se non visualizzato, l'interfaccia utente iis è completamente remotabile tramite HTTPS.