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. Ciò consente agli sviluppatori di aggiungere, rimuovere e sostituire facilmente i componenti IIS predefiniti con quelli creati manualmente, specificamente adatti per qualsiasi sito Web specifico. Non è mai stato così facile collegare il codice nella pipeline principale di IIS ed estendere IIS in modi impossibili prima.
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 di 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 il supporto dell'API e della riga di comando per la configurazione di questo gestore e come scrivere un modulo dell'interfaccia utente nell'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 è guidata dalla 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 dell'estensione dell'interfaccia utente consente la configurazione della funzionalità dei messaggi di copyright tramite l'interfaccia utente di IIS
Prerequisiti
Per seguire la procedura descritta in questo documento, è necessario installare il software seguente:
ASP.NET
Installare ASP.NET tramite windows Vista Pannello di controllo. 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 "Strumenti e script 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 " Strumenti e script 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 ruolo". In "Strumenti di gestione Web" selezionare " Iis Management Scripts and Tools ".
Visual C# Express Edition o Visual Studio 2005
Per il modulo dell'interfaccia utente è necessario uno strumento di sviluppo C#. Se non si ha 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 dei privilegi.
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.
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, verrà sviluppato un plug-in Dell'interfaccia utente per Gestione IIS.
Passaggio 1 - Estendibilità della configurazione: configurazione per il gestore copyright immagine
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 booleano che abilita o disabilita la funzionalità imageCopyright
- Attributo stringa contenente il messaggio di copyright
- Attributo di colore 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, è necessario dichiarare lo schema 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>
Configurarlo
Il processo è stato completato. È 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 shell dei comandi e immettere 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 imageCopyright Configuration Scriptable
Nota
Rendere disponibile la configurazione del gestore imageCopyright per gli script WMI è facoltativa. È possibile passare direttamente a "Step 2 – Core Extensibility: The Image Copyright Handler" 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 dello 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 WMI sugli SKU del client Vista
Installare gli "script e gli strumenti di gestione IIS" 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 "Strumenti e script di gestione IIS".
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 ruolo". In "Strumenti di gestione" selezionare "Strumenti e script 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. Esempio:
Attività
Aprire un'istanza di NOTEPAD 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
. Guarda.
Aggiungere quindi il gestore del copyright dell'immagine stesso.
Passaggio 2 - Estendibilità di base: Gestore copyright immagine
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 . Viene eseguito il mapping di ASP 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 anche consentito la gestione delle estensioni di file, ma solo se è stato eseguito il mapping della richiesta a ASP.NET prima. 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 del contenuto
Creare una directory di contenuto, ad esempio c:\inetpub\mypictures
, e copiarne alcune immagini digitali a scelta. Assicurarsi che questi file siano file di immagine con l'estensione .JPG.
Nota
Ai fini della 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\_Code
ad 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 eseguire questa operazione. Creare una nuova applicazione tramite appcmd. Il comando seguente crea un'app denominata "mypictures" nel "Sito Web predefinito" con il percorso c:\inetpub\mypictures
fisico :
%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 si richiede http://localhost/mypictures
, viene visualizzata una lista di directory con le 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 tipo di carattere utilizzando i valori configurati
- Disegna il messaggio nella bitmap
Per utilizzare 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 nel 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 se è richiesto un file di .JPG. Eseguire questa operazione tramite la Console di gestione IIS o 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:
name
Può essere qualsiasi nome univoco. Il nome viene usato solo per identificare in modo univoco il gestore.
path
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.
verb
Elenco delimitato da virgole di verbi HTTP 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 con copyright, assicurarsi che il processo di lavoro IIS che esegue la richiesta selezioni le modifiche dello schema apportate. È possibile che il processo di lavoro sia già in esecuzione quando è stato aggiunto il file imageCopyright.xml alla directory dello schema. In questo caso, viene generata un'eccezione di configurazione in imagecopyrightconfig.cs. L'autore ha riscontrato questo problema durante la scrittura di questo articolo e costa molto tempo.
Il semplice riciclo del pool di applicazioni risolve questo problema:
appcmd recycle AppPool DefaultAppPool
Il processo è stato completato. 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, ad esempio 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']
Passaggio 3 - Creazione del modulo dell'interfaccia utente copyright immagine
Tempo per i tocchi finali. Il server principale IIS è già stato esteso con alcune righe di codice; Abbiamo esteso il sistema di configurazione IIS senza codice e abbiamo ottenuto gratuitamente il supporto della riga di comando. 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 dalla Console di gestione IIS.
Passaggi
Fare clic su Start, scegliere Programmi ed eseguire Microsoft Visual Studio 2005 o Microsoft Visual C# 2005 Express Edition.
Nel menu File selezionare l'opzione Nuovo progetto.
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.
Figura 2: Finestra di dialogo Nuovo progettoRimuovere il file Class1.cs aggiunto per impostazione predefinita perché non verrà usato.
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.
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 la lettura della configurazione che scrive la configurazione di IIS.
Poiché si usa il codice per creare l'interfaccia utente basata su WinForms, si vuole anche aggiungere un riferimento a System.Windows.Forms.dll; per questo usando di nuovo l'opzione Aggiungi nuovo riferimento dal menu Progetto, selezionare System.Windows.Forms.dll e System.Web.dll in the.NET elenco di assembly.
Uno dei requisiti per l'uso delle librerie all'interno di InetMgr è che devono essere registrati all'interno della GAC. A tale scopo, è necessario assicurarsi che la DLL sia fortemente denominata (talvolta denominata 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 ImageCopyrightUI Properties (Proprietà diCopyrightUI).
Nella scheda Firma selezionare Firma l'assembly.
Nella casella di controllo Crea chiave con nome sicuro imageCopyrightUI come nome per la chiave e deselezionare la casella di controllo Proteggi il file di chiave con una password. Fare clic su OK.
Figura 3: Finestra di dialogo Crea nome sicuroViene visualizzata la scheda firma:
Figura 4: Scheda Firma progetto VSPoiché si vuole che l'assembly sia presente nella GAC, si aggiungeranno alcuni eventi post-compilazione in modo che venga aggiunto automaticamente alla GAC ogni volta che si compila. In questo modo sarà molto semplice 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 post-compilazione evento seguente:
call "%VS80COMNTOOLS%\vsvars32.bat" > NULL
gacutil.exe /if "$(TargetPath)"
Figura 5: Scheda Eventi post-compilazione di Visual Studio(Facoltativo) Se si usa Microsoft Visual Studio 2005 (questa operazione non funziona 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 La scheda Debug e impostarla per avviare un programma esterno scegliendo \windows\system32\inetsrv\inetmgr.exe
Figura 6: Scheda DebugInfine, chiudere le proprietà del progetto, selezionare l'opzione Salva tutto nel menu File e fare clic su OK.
Compilare ora il progetto usando Compila soluzione nel menu Compila. In questo modo la DLL viene compilata automaticamente 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 di 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.
Passaggi
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 del file.
Figura 7: Finestra di dialogo Aggiungi nuovo elementoModificare 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.
Passaggi
Selezionare l'opzione Aggiungi nuovo elemento nel menu Progetto.
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 viene lasciato è scrivere la pagina stessa.
Creazione della pagina del 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 simile a una griglia gerarchica. Gli esempi 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 le impostazioni e le offerte di ricerca, raggruppamento e visualizzazioni automaticamente. Gli esempi includono impostazioni dell'applicazione, moduli, processi di lavoro e così via.
Passaggi
Selezionare l'opzione Aggiungi nuovo elemento dal menu Progetto.
Nella finestra di dialogo Aggiungi nuovo elemento selezionare il modello Classe e digitare imageCopyrightUIPage.cs come nome del 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 esegue altro che inserire un paio di controlli in ModulePage e legge e scrive nell'archivio di configurazione IIS.
Lettura della configurazione
La funzione ReadConfig utilizza le stesse interfacce Microsoft.Web.Administration per aprire l'archivio di configurazione IIS. L'interfaccia utente stessa 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 nel trasferimento dell'interfaccia utente negli attributi della sezione e nella sezione vengono salvate su disco.
section.GetAttribute("enabled").Value = (object)featureenabled;
mgr.CommitChanges();
A questo punto, si è pronti per compilare di nuovo tutto usando "Compila soluzione" dal menu Di compilazione. Viene compilata l'immagine dell'assemblyCopyrightUI e viene inserita nella Global Assembly Cache.
Registrazione del modulo
Il modulo dell'interfaccia utente viene 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
Passaggi
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
Eseguire GacUtil
GACUTIL /l imageCopyrightUI
Aprire
%windir%\system32\inetsrv\config\administration.config
e aggiungere quanto segue 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".
Figura 8: Interfaccia utente copyright immagine
Modificare il messaggio di copyright, fare clic su Applica e aggiornare il browser. Il messaggio di copyright è cambiato. Esaminare il file web.config nella %systemdrive%\inetpub\mypictures
directory per visualizzare la configurazione modificata.
Riepilogo
IIS è estendibile in modi non possibili in precedenza. È possibile estendere la pipeline di elaborazione core IIS con il proprio componente, archiviare la configurazione per questo componente insieme alla configurazione iis e anche scrivere un plug-in dell'interfaccia utente affiancato alle impostazioni standard di IIS. Per esaminare ciò che è stato fatto nell'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 aggiunto anche 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 di IIS è completamente remotabile tramite HTTPS.