Um exemplo de extensibilidade de ponta a ponta para desenvolvedores do IIS 7.0
por Saad Ladki
O IIS 7 e superiores são criados com uma arquitetura completamente modular, além de APIs de extensibilidade avançadas. Isso permite que os desenvolvedores adicionem, removam e até substituam com facilidade os componentes internos do IIS pelos elaborados, especificamente adequados para qualquer site específico. Nunca foi tão fácil conectar código profundamente ao pipeline principal do IIS e estender o IIS de maneiras que eram impossíveis antes.
Para dar alguns exemplos: algumas linhas de código permitem que os desenvolvedores escrevam módulos ou manipuladores que fornecem novos esquemas de autenticação e autorização, realizem análise de runtime ou segurança da solicitação de entrada e inspecionem as respostas. Mas, para fornecer um valor agregado real, esses módulos devem ser gerenciáveis por meio de interfaces de programação, ferramentas de linha de comando e uma interface do usuário.
Este white paper é um exemplo de ponta a ponta de como estender o servidor Web do IIS com um manipulador de solicitação personalizado. Ele mostra como adicionar suporte para API e linha de comando para a configuração desse manipulador e como escrever plugs do módulo de interface do usuário na interface de Gerenciamento do IIS.
A solução foi testada no Windows Vista e no Windows Server® 2008 Beta 3. Ela será atualizada assim que a versão final do Windows Server 2008 estiver disponível.
Conjunto de recursos
- O manipulador gerenciado insere uma mensagem de direitos autorais em arquivos de imagem
- O recurso de mensagem de direitos autorais é controlado pela configuração e usa o novo sistema de configuração do IIS
- A configuração pode ser esquematizada e fica acessível às APIs de configuração, ao script WMI e às ferramentas de linha de comando do IIS
- O Módulo de Extensão de Interface do Usuário permite a configuração do recurso de mensagem de direitos autorais por meio da interface do usuário do IIS
Pré-requisitos
Para seguir as etapas neste documento, o seguinte software deve ser instalado:
ASP.NET
Instale o ASP.NET através do Painel de Controle do Windows Vista. Selecione "Programas" – "Ativar ou desativar recursos do Windows". Em seguida, abra "Serviços de Informações da Internet" – "Serviços da World Wide Web" – "Recursos de desenvolvimento de aplicativos" e marque “ASP.NET”.
Se você tiver um build do Windows Server 2008. abra "Gerenciador do Servidor" – "Gerenciar Funções" e selecione "Servidor Web (IIS)". Clique em “Adicionar serviços de função”. Em "Desenvolvimento de Aplicativos", marque "ASP.NET".
Você também deve instalar "Scripts e Ferramentas de Gerenciamento do IIS" para aproveitar a extensibilidade do WMI no IIS. Para fazer isso, selecione "Programas" – "Ativar ou desativar recursos do Windows". Em seguida, abra "Serviços de Informações da Internet" – "Ferramentas de Gerenciamento da Web" e marque " Scripts e Ferramentas de Gerenciamento do IIS".
Se você tiver uma compilação do Windows Server 2008, abra "Gerenciador do Servidor" – "Funções" e selecione "Servidor Web (IIS)". Clique em “Adicionar serviços de função”. Em "Ferramentas de Gerenciamento da Web", verifique " Scripts e Ferramentas de Gerenciamento do IIS".
Visual C# Express Edition ou Visual Studio 2005
Para o Módulo de Interface do Usuário, você precisa de uma Ferramenta de Desenvolvimento em C#. Se você não tiver uma cópia do Visual Studio 2005, baixe o Visual Studio gratuitamente.
Lidar com problemas de controle de conta de usuário
A Proteção de Conta de Usuário do Windows Vista remove os privilégios de Administrador do token de acesso. Por padrão, você não terá acesso à configuração do IIS e aos locais de conteúdo. Para corrigir esse problema, recomendamos percorrer este artigo usando um prompt de comandos com privilégios elevados.
Para iniciar um prompt de comandos com privilégios elevados, vá para o menu "Iniciar", clique em "Todos os Programas" – "Acessórios". Clique com o botão direito do mouse em "Prompt de Comando" e clique em "Executar como administrador". Confirme a solicitação de elevação.
Cenário
O exemplo a seguir decora dinamicamente as imagens atendidas por nosso servidor Web com informações de direitos autorais no canto inferior esquerdo, como visto na Figura 1.
Figura 1: Módulo de direitos autorais de imagem em ação
Usamos código gerenciado para desenvolver o manipulador que decora as imagens. Como parte do exemplo, também especificamos a configuração desse manipulador e a armazenamos no repositório de configurações do IIS. Por fim, desenvolveremos um plug-in da Interface do Usuário para o Gerenciador do IIS.
Etapa 1 – Extensibilidade de Configuração: configuração para o Manipulador de Direitos Autorais de Imagem
O repositório de configurações do IIS pode ser estendido simplesmente copiando um arquivo de esquema para o diretório de esquema do IIS. O esquema declara o nome da nova seção de configuração e seus atributos, tipos e valores padrão. Para nosso exemplo, declaramos uma nova seção de configuração chamada imageCopyright. Ela reside no grupo de configuração system.webServer. Suas propriedades são:
- Um sinalizador booliano que habilita ou desabilita a funcionalidade imageCopyright
- Um atributo de cadeia de caracteres que contém a mensagem de direitos autorais
- Um atributo de cor que especifica a cor da mensagem de direitos autorais
Declaração de esquema
Salve a seguinte definição de esquema como imagecopyright.xml em %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 você receber uma mensagem de "acesso negado", não fez isso no prompt de comandos com privilégios elevados. Depois que o arquivo de esquema é adicionado, o esquema precisa ser declarado no arquivo applicationhost.config. Adicione o XML a seguir a %windir%\system32\inetsrv\config\applicationhost.config
<configSections>
...
<sectionGroup name="system.webServer">
<section name="imageCopyright" overrideModeDefault="Allow"/>
...
</sectionGroup>
</configSections>
Configure-o
O processo está concluído. Você pode definir as novas configurações por meio da linha de comando ou diretamente em applicationhost.config ou web.config. Experimente. Abra um shell de comando e insira o seguinte:
<system.webServer>
<imageCopyright />
</system.webServer>
A saída mostra que a seção de configuração foi reconhecida, com sua configuração padrão:
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/imageCopyright
/color:yellow /message:"Copyright (C) Contoso.COM" /enabled:true
Agora, adicione as configurações por meio de appcmd.exe, por exemplo,
%windir%\system32\inetsrv\appcmd set config -section:system.webServer/imageCopyright
/color:yellow /message:"Copyright (C) Contoso.COM" /enabled:true
Verifique se a configuração foi salva executando:
%windir%\system32\inetsrv\appcmd list config -section:system.webServer/imageCopyright
Consulte a configuração salva:
<system.webServer>
<imageCopyright enabled="true" message="Copyright (C) Contoso.COM" color="yellow" />
</system.webServer>
Tornar a configuração imageCopyright apta a script
Observação
Disponibilizar a configuração do manipulador imageCopyright para scriptS WMI é opcional. Você pode ir diretamente para "Etapa 2 – Extensibilidade principal: O manipulador de direitos autorais de imagem" sem afetar as etapas restantes.
Para disponibilizar a configuração do manipulador imageCopyright para scripts WMI, conclua as seguintes etapas:
- Instalação do suporte ao WMI do IIS
- Criar o arquivo imageCopyright.mof
- Incluir o arquivo imageCopyright.mof em webadministration.mof e compilação dos arquivos de esquema WMI
- Gravar e executar o script
Instalação do suporte ao WMI do IIS
A instalação padrão do IIS não inclui os componentes de script WMI. Você deve adicioná-los.
Instalação do suporte do WMI em SKUs do cliente Vista
Instale "Scripts e Ferramentas de Gerenciamento do IIS" por meio do Painel de Controle do Windows Vista. Selecione "Programas" – "Ativar ou desativar recursos do Windows". Em seguida, abra "Serviços de Informações da Internet" – "Ferramentas de Gerenciamento da Web" e marque "Scripts e Ferramentas de Gerenciamento do IIS".
Instalação do suporte para WMI em SKUs do Windows Server 2008
Se você tiver uma compilação do Windows Server 2008, abra "Gerenciador do Servidor" – "Funções" e selecione "Servidor Web (IIS)". Clique em “Adicionar serviços de função”. Em "Ferramentas de Gerenciamento", verifique "Scripts e Ferramentas de Gerenciamento do IIS".
Criar o arquivo imageCopyright.mof
A declaração de esquema de propriedades WMI é muito semelhante à declaração de esquema das propriedades do IIS na etapa anterior. Os esquemas WMI são declarados em arquivos .mof e compilados por uma ferramenta chamada mofcomp. O Mofcomp adiciona a declaração de esquema ao repositório WMI.
Tarefas para adicionar as informações de esquema
Abra uma instância do bloco de notas e copie as seguintes linhas para ela:
#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;
};
A declaração de esquema contém as mesmas entradas que imageCopyright.xml na etapa anterior, ou seja, o nome e o tipo da configuração e seu valor padrão. Salve o arquivo como %windir%\system32\inetsrv\imageCopyright.mof
.
Compilação de arquivos de esquema WMI
Compile imageCopyright.mof executando o comando a seguir
mofcomp webadministration.mof
O script WMI
O Mofcomp adicionou o esquema imageCopyright ao repositório WMI. Defina as configurações do IIS fazendo script do provedor WMI do IIS. Este é um exemplo:
Tarefas
Abra uma instância do NOTEPAD e copie as linhas a seguir para ela. Salve o arquivo como 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_
Esse é um script WMI padrão que se conecta ao provedor WMI do IIS. Ele obtém a seção de configuração no local especificado ("Site Padrão") e altera seus valores. A chamada Put_ salvará as alterações no disco.
Se você executar o script, ele adicionará a mensagem de direitos autorais com a data atual em %systemdrive%\inetpub\wwwroot\web.config
. Dê uma olhada.
Em seguida, adicione o próprio manipulador de direitos autorais de imagem.
Etapa 2 – Extensibilidade principal: o manipulador de direitos autorais de imagem
Um manipulador é uma parte do código executada quando a solicitação corresponde a um determinado padrão, geralmente uma extensão de arquivo. Solicitações que terminam com . ASP são mapeadas para ASP.DLL, por exemplo. No IIS 6.0, você precisava escrever uma extensão ISAPI para lidar com solicitações com determinada extensão de arquivo. O ASP.NET também permitia o tratamento de extensões de arquivo, mas apenas se você mapeasse a solicitação para ASP.NET primeiro. No IIS, você pode lidar com extensões de arquivo arbitrárias sem envolver ASP.NET. Em nosso exemplo, lidamos com solicitações com a extensão .JPG. Veja como fazer isso:
Criar o diretório de conteúdo
Crie um diretório de conteúdo, por exemplo, c:\inetpub\mypictures
, e copie algumas imagens digitais de sua escolha para ele. Verifique se esses arquivos são arquivos de imagem com a extensão .JPG.
Observação
Para simplificar, os exemplos de código mostrados aqui não incluem código de tratamento de erro para arquivos que não são de imagem.
Crie um subdiretório chamado App_Code abaixo do novo diretório: por exemplo, c:\inetpub\mypictures\App\_Code
.
Criar o aplicativo mypictures
Você pode criar um aplicativo que aponte para c:\inetpub\mypictures
por meio do console de Gerenciamento do IIS, mas há maneiras mais interessantes de fazer isso. Criar um aplicativo por meio do appcmd. O comando a seguir cria um aplicativo chamado "mypictures" no "Site Padrão" com o caminho físico c:\inetpub\mypictures
:
%windir%\system32\inetsrv\appcmd add app -site.name:"Default Web Site"
-path:/mypictures -physicalPath:%systemdrive%\inetpub\mypictures
Como queremos ver os arquivos JPG copiados para esse diretório, habilite a pesquisa no diretório. Faça isso por meio do Console de Gerenciamento do IIS ou recorra a um método mais interessante e use appcmd. Veja aqui como definir a navegação de diretório como true por meio do appcmd:
%windir%\system32\inetsrv\appcmd set config "Default Web Site/mypictures"
-section:directoryBrowse -enabled:true
Se você solicitar http://localhost/mypictures
, verá uma listagem de diretórios com suas imagens.
Hora de escrever código
Agora, escreva o código de tratamento de imagem real. Escreva algumas linhas de código C# e você tem o resultado: use o código abaixo como referência e salve-o como imagecopyrighthandler.cs no diretório App_Code, por exemplo, 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; }
}
}
}
O código acima faz o seguinte:
- Lê a configuração
- Chama HandleImage
HandleImage faz o seguinte:
- Cria um objeto Gráfico por meio do bitmap
- Cria um objeto de fonte usando os valores configurados
- Desenha a mensagem no bitmap
Para usar a classe Microsoft.Web.Administration, você deve adicionar a referência ao assembly da API de Administração do IIS. Para fazer isso, abra %systemdrive%\inetpub\mypictures\web.config
e adicione as seguintes entradas:
<system.web>
<compilation>
<assemblies>
<add assembly="Microsoft.Web.Administration, Version=7.0.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"/>
</assemblies>
</compilation>
</system.web>
Você também pode compilar o manipulador em um assembly e colocá-lo em mypictures/bin. Se você fizer isso, não precisará adicionar o assembly Microsoft.Web.Administration ao arquivo web.config.
Configuração do manipulador
Você só precisa dizer ao IIS para invocar seu manipulador se um arquivo .JPG for solicitado. Faça isso por meio do Console de Gerenciamento do IIS ou use appcmd:
appcmd set config "Default Web Site/mypictures/" -section:handlers
/+[name='JPG-imageCopyrightHandler',path='*.jpg',verb='GET',type='IIS7Demos.imageCopyrightHandler']
O comando appcmd acima configura o novo manipulador apenas no diretório /mypictures. Como as entradas do manipulador estão em uma coleção, você precisa usar a sintaxe +[]. Essa sintaxe é sempre usada quando elementos de adição devem ser adicionados às coleções. Os elementos da configuração do manipulador são:
name
Pode ser qualquer nome exclusivo. O nome é usado apenas para identificar exclusivamente o manipulador.
caminho
Informa ao IIS quando executar esse manipulador. *.JPG informa ao IIS para executar esse manipulador para todos os arquivos que terminam em .JPG. Se você usar foo*.JPG como um caminho, apenas arquivos JPG começando com foo serão executados por esse manipulador.
verbo
Lista de verbos http separados por vírgulas que precisam corresponder para executar esse manipulador. Em nosso caso, só queremos executar a solicitação quando uma solicitação GET chegar.
tipo
O tipo gerenciado da classe que deve ser executada quando a solicitação corresponde. Ele é composto pelo namespace e pela classe derivada IHttpHandler em seu diretório App_Code.
Uma última observação
Antes de começar a testar as imagens com direitos autorais, verifique se o processo de trabalho do IIS que executa a solicitação seleciona as alterações de esquema feitas. É possível que o processo de trabalho já estivesse em execução quando você adicionou o arquivo imageCopyright.xml ao diretório de esquema. Se isso acontecer, você obterá uma exceção de configuração em imagecopyrightconfig.cs. O autor encontrou esse problema ao escrever este artigo, e isso custou bastante tempo a ele.
Simplesmente reciclar o Pool de Aplicativos resolve este problema:
appcmd recycle AppPool DefaultAppPool
O processo está concluído. Se você agora solicitar http://localhost/mypictures/<imageOfYourChoice>.jpg)
, verá a mensagem de direitos autorais.
Opções:
- Você pode alterar as opções de mensagem de direitos autorais por meio do appcmd ou editando diretamente o arquivo web.config
- Você pode mapear o manipulador imageCopyright para outros tipos de imagem, por exemplo, BMP ou GIF, adicionando o mesmo manipulador para uma extensão diferente. Exemplo:
appcmd set config "Default Web Site/mypictures/" -section:handlers /+[name='BMP-imageCopyrightHandler',path='*.bmp',verb='GET',type='IIS7Demos.imageCopyrightHandler']
Etapa 3 – Criar o módulo de interface do usuário de direitos autorais de imagem
Hora dos retoques finais. Já estendemos o servidor principal do IIS com algumas linhas de código; estendemos o sistema de configuração do IIS sem nenhum código e obtivemos suporte de linha de comando sem custo algum. Agora, para configurar nosso manipulador imageCopyright por meio do Console de Gerenciamento do IIS.
Fazemos isso por meio das seguintes tarefas:
- Criar o projeto no Microsoft Visual Studio ou no Microsoft Visual C# Express para que o assembly possa ser usado dentro do Console de Gerenciamento do IIS
- Criar um provedor de módulo
- Criar um módulo que lê e define propriedades imageCopyright.
Criando o Projeto
Para criar um módulo de extensibilidade para o InetMgr, você precisa criar um projeto DLL, também conhecido como um projeto da Biblioteca de Classes. Essa DLL precisa ser fortemente nomeada para que possa ser registrada no GAC (cache de assembly global), que é um requisito para módulos usados pelo Console de Gerenciamento do IIS.
Etapas
Clique em Iniciar, clique em Programas e execute o Microsoft Visual Studio 2005 ou o Microsoft Visual C# 2005 Express Edition.
No Menu Arquivo, selecione a opção Novo Projeto.
Na caixa de diálogo Novo Projeto, selecione Biblioteca de Classes como o tipo de projeto e digite imageCopyrightUI como o nome do projeto e clique em OK.
Figura 2: Caixa de diálogo Novo ProjetoRemova o arquivo Class1.cs que foi adicionado por padrão, pois não o usaremos.
Usando a opção Adicionar Nova Referência no Menu projeto, adicione uma referência a Microsoft.Web.Management.dll localizada no diretório \Windows\system32\inetsrv. Essa é a DLL que contém todas as classes de extensibilidade necessárias para criar módulos para o Console de Gerenciamento do IIS.
Usando a opção Adicionar Nova Referência no Menu Projeto, adicione uma referência a Microsoft.Web.Administration.dll localizada no diretório \Windows\system32\inetsrv. Essa é a DLL que contém todas as classes de configuração necessárias para ler a configuração que grava a configuração do IIS.
Como vamos usar o código para criar a interface do usuário com base no WinForms, também queremos adicionar uma referência a System.Windows.Forms.dll; para isso, mais uma vez usando a opção Adicionar Nova Referência no Menu Projeto, selecione System.Windows.Forms.dll e System.Web.dll na lista the.NET de assemblies.
Um dos requisitos para usar as bibliotecas usadas no InetMgr é que elas precisam ser registradas no GAC. Para isso, precisamos garantir que a DLL seja fortemente nomeada (às vezes conhecida como Assinada). O Visual Studio oferece um modo fácil de criar novos nomes e selecionar um para o projeto, portanto, usando o menu Projeto, selecione a opção propriedades imageCopyrightUI.
Na Guia Assinatura, marque Assinar o assembly.
Na imagem Criar Chave de Nome Forte, digite imageCopyrightUI como o nome da chave e desmarque a caixa de seleção Proteger meu arquivo de chave com uma senha. Clique em OK.
Figura 3: Caixa de diálogo Criar Nome ForteA guia de assinatura exibe:
Figura 4: Guia de Assinatura do VS ProjectComo queremos que o assembly esteja no GAC, vamos adicionar alguns eventos pós-build para que ele seja adicionado automaticamente ao GAC sempre que compilarmos. Isso fará com que ele seja realmente direto para depurar e fazer alterações à medida que adicionamos funcionalidades. Para isso, selecione a guia Eventos de Build e adicione a seguinte linha de comando de pós-evento de build:
call "%VS80COMNTOOLS%\vsvars32.bat" > NULL
gacutil.exe /if "$(TargetPath)"
Figura 5: Guia Eventos pós-build do VS(Opcional) Se você estiver usando o Microsoft Visual Studio 2005 (isso não funcionará com o Visual C# Express Edition), configure a depuração corretamente para usar F5 para executar seu código. Para fazer isso, vá para as propriedades do projeto, selecione a guia Depurar e defina-a para iniciar um programa externo escolhendo \windows\system32\inetsrv\inetmgr.exe
Figura 6: Guia DepuraçãoPor fim, feche as propriedades do projeto, selecione a opção Salvar Tudo no Menu Arquivo e clique em OK.
Agora compile o projeto usando Compilar Solução no menu Compilar. Isso compila automaticamente a DLL e a adiciona ao GAC.
Criar o provedor de módulo
A interface do usuário do IIS é tão personalizável e modular quanto o servidor principal do IIS e o sistema de configuração do IIS. A interface do usuário do IIS é um conjunto de módulos de recursos que podem ser removidos ou substituídos. O ponto de entrada para cada módulo de interface do usuário é um provedor de módulo. Uma lista de todos os provedores de módulos pode ser encontrada em %windir%\system32\inetsrv\Administration.config
na seção <modules>
.
Como primeira etapa, crie o provedor de módulo imageCopyrightUI.
Etapas
Selecione a opção Adicionar Novo Item no menu Projeto. Na caixa de diálogo Adicionar Novo Item, selecione o modelo de Classe e digite imageCopyrightUIModuleProvider.cs como o nome do arquivo.
Figura 7: Caixa de diálogo Adicionar Novo ItemAltere o código para que ele fique da seguinte maneira:
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; } } }
Esse código cria um ModuleProvider que dá suporte a todos os tipos de escopos (Servidor, Site e Aplicativo) e registra um módulo do lado do cliente chamado imageCopyrightUI. Para mostrar apenas o módulo no nível do aplicativo, a função SupportsScope tem esta aparência:
public override bool SupportsScope(ManagementScope scope) { return (scope == ManagementScope.Application) ; }
Criar o módulo de interface do usuário
Um Módulo é o principal ponto de entrada no cliente para todos os objetos de extensibilidade. Ele tem um método principal chamado Initialize. Esse é o método em que toda a ação ocorre.
Etapas
Selecione a opção Adicionar Novo Item no menu Projeto.
Selecione o modelo de classe e digite imageCopyrightUI.cs como o nome do arquivo. Altere o código para que ele fique da seguinte maneira:
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); } } }
No código acima, especificamos o texto da entrada na lista de módulos de interface do usuário e o tipo de uma só página que deve ser exibida quando um usuário clica nesse texto.
Tudo o que resta é escrever a própria página.
Criar a página do módulo
Nesta tarefa, você vai criar a página de módulo mais básica. ModulePage é a classe base fornecida pela estrutura para criar uma interface do usuário. A estrutura fornece quatro classes que são úteis, dependendo do cenário que você está tentando criar.
- ModulePage. Essa classe base oferece apenas os serviços mais básicos e não oferece nenhuma interface do usuário especial. Nenhum dos recursos incluídos no InetMgr deriva diretamente dessa classe.
- ModuleDialogPage. Essa classe base oferece semântica semelhante como uma caixa de diálogo, incluindo um link Aplicar e Cancelar na lista de tarefas, e oferece métodos específicos que você pode substituir para lidar com essas tarefas comuns. Ela também lida com coisas como Atualizar e outras funções automaticamente. Exemplos de recursos que derivam dessa página incluem Machine Key, Serviço de Gerenciamento etc.
- ModulePropertiesPage. Essa classe base oferece uma interface do usuário semelhante à Grade de Propriedades do Visual Studio, em que todas as propriedades são exibidas em um controle hierárquico semelhante à grade. Exemplos disso incluem CGI, ASP, Compilação do .NET etc.
- ModuleListPage. Essa classe base é útil sempre que você precisa exibir uma lista de itens. Ela inclui um controle ListView que você pode usar para exibir as configurações e ofertas de pesquisa, agrupamento e exibições automaticamente. Os exemplos incluem Configurações de Aplicativo, Módulos, Processos de Trabalho etc.
Etapas
Selecione a opção Adicionar Novo Item no menu Projeto.
Na caixa de diálogo Adicionar Item, selecione o modelo de Classe e digite imageCopyrightUIPage.cs como o nome do arquivo. Altere o código para que ele fique da seguinte maneira:
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 {} } } }
Embora haja muito, esse código não faz nada mais do que colocar alguns controles no ModulePage e lê e grava no repositório de configurações do IIS.
Ler a configuração
A função ReadConfig usa as mesmas interfaces Microsoft.Web.Administration para abrir o repositório de configurações do IIS. A interface do usuário em si fornece o escopo no qual as configurações serão aplicadas.
Exemplo:
Connection.ConfigurationPath.SiteName,
Connection.ConfigurationPath.ApplicationPath+
Connection.ConfigurationPath.FolderPath
Salvar a configuração
A configuração é salva quando o botão Aplicar é clicado (função applyClick). As alterações feitas na transferência da interface do usuário para os atributos da seção e a seção são salvas em disco.
section.GetAttribute("enabled").Value = (object)featureenabled;
mgr.CommitChanges();
Neste ponto, você está pronto para compilar tudo novamente usando "Compilar Solução" no Menu Compilar. Isso compila o assembly imageCopyrightUI e o coloca no Cache de Assembly Global.
Registro de módulo
O Módulo da interface do usuário foi criado, mas ainda precisamos dizer para o Console de Gerenciamento do IIS para carregá-lo. Faça isso:
- Obtendo o nome forte do módulo de interface do usuário do Cache de Assembly Global
- Adicionando o nome forte e o tipo ao arquivo de configuração do Console de Gerenciamento do IIS. Isso fará com que o Console de Gerenciamento do IIS carregue o tipo na inicialização
- Habilitando o módulo na lista de módulos da interface do usuário
Etapas
Abra ou use um shell de comando com privilégios elevados existente e registre as variáveis de ambiente do Visual Studio 8.0 executando o seguinte comando:
"%vs80comntools%\vsvars32.bat
Executar GacUtil
GACUTIL /l imageCopyrightUI
Abra
%windir%\system32\inetsrv\config\administration.config
e adicione o seguinte logo após a entrada<moduleProviders>
:<add name="imageCopyrightUI" type="IIS7Demos.imageCopyrightUIProvider, IIS7Demos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3fd9bd5e992ee757"/>
O resultado
A tarefa está concluída. Observe os resultados.
Abra o Console de Gerenciamento do IIS e navegue até o aplicativo /mypictures.
Clique duas vezes na entrada "Direitos autorais de imagem".
Figura 8: Interface do usuário de direitos autorais de imagem
Altere a mensagem de direitos autorais, clique em aplicar e atualize seu navegador. A mensagem de direitos autorais foi alterada. Examine o arquivo web.config no diretório %systemdrive%\inetpub\mypictures
para ver a configuração alterada.
Resumo
O IIS é extensível de maneiras que antes não eram possíveis. Você pode estender o pipeline de processamento principal do IIS com seu próprio componente, armazenar a configuração desse componente junto com a configuração do IIS e até mesmo gravar um plug-in de interface do usuário que reside lado a lado com as configurações padrão do IIS. Para examinar o que fizemos no exemplo anterior:
Extensibilidade do IIS Core
Adicionamos um manipulador de imagens ao núcleo do IIS que insere uma mensagem de direitos autorais em cada arquivo .JPG que é atendido. Isso foi feito com apenas algumas linhas de código C#. A funcionalidade do manipulador era conduzida por configuração. Armazenamos a configuração nos arquivos de configuração regulares do IIS applicationhost.config e web.config. Também adicionamos suporte de cache para as imagens.
Extensibilidade do sistema de configuração do IIS
Adicionamos a configuração do manipulador de direitos autorais de imagem ao sistema de configuração do IIS. Benefícios como um repositório xml e altamente legível, API instantânea e suporte de linha de comando, delegação e implantações distribuídas vieram sem custo algum. Não foi necessário escrever uma linha de código sequer.
Extensibilidade da interface do usuário do IIS
Para dar ao nosso recurso a visibilidade que ele merece, adicionamos um Módulo de Interface do Usuário do IIS. Embora não seja mostrado, a Interface do Usuário do IIS é completamente remota por meio de HTTPS.