Passo a passo: criando um aplicativo Web Core hospedado
Este passo a passo demonstra como criar um aplicativo de console do Windows que usa os recursos do Hosted Web Core que estão disponíveis no IIS 7.
A funcionalidade Do Núcleo da Web Hospedada no IIS 7 permite que você crie um aplicativo que carrega uma instância do núcleo do IIS, que é o aplicativo Web base e a funcionalidade de serviço de conteúdo fornecida pelo IIS. Para obter mais informações sobre o Núcleo da Web Hospedado, consulte Referência de API do Web Core hospedado.
Você precisa fornecer um arquivo de configuração para seu aplicativo que siga o formato do arquivo ApplicationHost.config. No entanto, você não deve usar o arquivo de ApplicationHost.config real, pois ele pode conter configurações que entram em conflito com as configurações do site. Para obter mais informações sobre como criar um arquivo de configuração para seu aplicativo, consulte Passo a passo: criando um arquivo de configuração para o Núcleo da Web Hospedado.
As tarefas ilustradas nesta explicação passo a passo incluem o seguinte:
Criar um projeto C++ para seu aplicativo.
Adicionando o código C++ para seu aplicativo.
Compilar e testar seu aplicativo.
Solução de erros ao usar seu aplicativo.
Pré-requisitos
O software a seguir é necessário para concluir as etapas no exemplo:
- IIS 7.
Observação
Embora seja necessário executar o aplicativo Web Core Hospedado em um computador que tenha o IIS 7 instalado, você não precisa compilar o aplicativo de exemplo em um computador que tenha o IIS 7 instalado. Você pode compilar seu aplicativo em uma versão diferente do Windows e, em seguida, copiar seu aplicativo para um computador que tenha o IIS 7 instalado.
- Visual Studio 2005.
Observação
Você também pode usar o Visual Studio .NET 2003 ou anterior, embora as etapas passo a passo possam não ser idênticas.
Criando um aplicativo Web Core hospedado
Nesta parte do passo a passo, você criará um projeto de aplicativo de console C++ para seu aplicativo.
Para criar um projeto C++ para seu aplicativo
Inicie o Visual Studio 2005.
Verifique se as opções globais têm todos os caminhos corretos para o SDK incluem arquivos:
No menu Ferramentas , clique em Opções.
A caixa de diálogo Opções é aberta.
Expanda o nó Projetos e Soluções no modo de exibição de árvore e clique em Diretórios VC++.
Na caixa Mostrar diretórios para , selecione Incluir arquivos.
Verifique se o caminho em que você instalou os arquivos de inclusão do SDK está listado. Se o caminho não estiver listado, clique no ícone Nova Linha e adicione o caminho em que você instalou os arquivos de inclusão do SDK.
Clique em OK.
Crie um novo projeto C++:
No menu Arquivo , aponte para Novoe clique em Projeto.
A caixa de diálogo Novo Projeto será aberta.
No painel Tipos de projeto , expanda o nó Visual C++ e clique em Win32.
No painel Modelos , clique em Projeto Win32.
Na caixa Nome , digite HostedWebTest.
Na caixa Local, digite o caminho do projeto.
Clique em OK.
O Assistente de Aplicativo Win32 é aberto.
Clique em Configurações do Aplicativo.
Em Tipo de aplicativo, clique em Aplicativo de Console.
Clique em Concluir.
O Visual Studio abre o projeto HostWebTest.cpp.
Configure o projeto para compilar usando a
__stdcall (/Gz)
convenção de chamada:No menu Projeto , clique em HostedWebTest Properties.
Expanda o nó Propriedades de Configuração no modo de exibição de árvore, expanda o nó C/C++ e clique em Avançado.
Na caixa Configuração , selecione Todas as Configurações
Na caixa Convenção de Chamada , selecione __stdcall (/Gz).
Clique em OK.
Adicionando o código para o aplicativo
Esta seção mostra como substituir o código que foi adicionado automaticamente ao arquivo C++ pelo código que executará o Núcleo da Web Hospedado.
Observação
Este exemplo procura um arquivo chamado HostedWebTest.config na pasta Inetsrv. Você pode modificar o caminho e o nome do arquivo, mas deve fornecer um arquivo de configuração válido. Para obter mais informações sobre como criar um arquivo de configuração para seu aplicativo, consulte Passo a passo: criando um arquivo de configuração para o Núcleo da Web Hospedado.
Para adicionar o código C++ para seu aplicativo
Abra o arquivo HostedWebTest.cpp, se ele ainda não estiver aberto e remova todo o código C++ existente.
Copie o seguinte código C++ para o arquivo:
#include "stdafx.h" #include <windows.h> #include <stdio.h> #include <conio.h> #include <hwebcore.h> // NOTE: Set the project's calling convention to "__stdcall (/Gz)". HRESULT _cdecl _tmain(int argc, _TCHAR* argv[]) { // Create a handle for the Web core DLL. HINSTANCE hDLL; // Specify the HRESULT for returning errors. HRESULT hr = S_OK; // Create arrays to hold paths. WCHAR wszInetPath[MAX_PATH]; WCHAR wszDllPath[MAX_PATH]; WCHAR wszCfgPath[MAX_PATH]; // Retrieve the path of the Inetsrv folder. DWORD nSize = ::ExpandEnvironmentStringsW( L"%windir%\\system32\\inetsrv",wszInetPath,MAX_PATH); // Exit if the path of the Inetsrv folder cannot be determined. if (nSize == 0) { // Retrieve the last error. hr = HRESULT_FROM_WIN32(GetLastError()); // Return an error status to the console. printf("Could not determine the path to the Inetsrv folder.\n"); printf("Error: 0x%x\n",hr); // Return an error from the application and exit. return hr; } // Append the Web core DLL name to the Inetsrv path. wcscpy_s(wszDllPath,MAX_PATH-1,wszInetPath); wcscat_s(wszDllPath,MAX_PATH-1,L"\\"); wcscat_s(wszDllPath,MAX_PATH-1,WEB_CORE_DLL_NAME); // Append the config file name to the Inetsrv path. wcscpy_s(wszCfgPath,MAX_PATH-1,wszInetPath); wcscat_s(wszCfgPath,MAX_PATH-1,L"\\HostedWebTest.config"); // Create a pointer to WebCoreActivate. PFN_WEB_CORE_ACTIVATE pfnWebCoreActivate = NULL; // Create a pointer to WebCoreShutdown. PFN_WEB_CORE_SHUTDOWN pfnWebCoreShutdown = NULL; // Load the Web core DLL. hDLL = ::LoadLibraryW(wszDllPath); // Test whether the Web core DLL was loaded successfully. if (hDLL == NULL) { // Retrieve the last error. hr = HRESULT_FROM_WIN32(GetLastError()); // Return an error status to the console. printf("Could not load DLL.\n"); printf("Error: 0x%x\n",hr); } else { // Return a success status to the console. printf("DLL loaded successfully.\n"); // Retrieve the address for "WebCoreActivate". pfnWebCoreActivate = (PFN_WEB_CORE_ACTIVATE)GetProcAddress( hDLL,"WebCoreActivate"); // Test for an error. if (pfnWebCoreActivate==NULL) { // Retrieve the last error. hr = HRESULT_FROM_WIN32(GetLastError()); // Return an error status to the console. printf("Could not resolve WebCoreActivate.\n"); printf("Error: 0x%x\n",hr); } else { // Return a success status to the console. printf("WebCoreActivate successfully resolved.\n"); // Retrieve the address for "WebCoreShutdown". pfnWebCoreShutdown = (PFN_WEB_CORE_SHUTDOWN)GetProcAddress( hDLL,"WebCoreShutdown"); // Test for an error. if (pfnWebCoreShutdown==NULL) { // Retrieve the last error. hr = HRESULT_FROM_WIN32(GetLastError()); // Return an error status to the console. printf("Could not resolve WebCoreShutdown.\n"); printf("Error: 0x%x\n",hr); } else { // Return a success status to the console. printf("WebCoreShutdown successfully resolved.\n"); // Return an activation status to the console. printf("Activating the Web core...\n"); // Activate the Web core. hr = pfnWebCoreActivate(wszCfgPath,L"",L"TestWebCore"); // Test for an error. if (FAILED(hr)) { // Return an error status to the console. printf("WebCoreActivate failed.\n"); printf("Error: 0x%x\n",hr); } else { // Return a success status to the console. printf("WebCoreActivate was successful.\n"); // Prompt the user to continue. printf("Press any key to continue...\n"); // Wait for a key press. int iKeyPress = _getch(); // Return a shutdown status to the console. printf("Shutting down the Web core...\n"); // Shut down the Web core. hr = pfnWebCoreShutdown(0L); // Test for an error. if (FAILED(hr)) { // Return an error status to the console. printf("WebCoreShutdown failed.\n"); printf("Error: 0x%x\n",hr); } else { // Return a success status to the console. printf("WebCoreShutdown was successful.\n"); } } } } // Release the DLL. FreeLibrary(hDLL); } // Return the application status. return hr; }
Salve o arquivo HostedWebTest.cpp.
Compilando e testando o aplicativo
Depois de criar e salvar o arquivo C++, a próxima etapa é compilar e testar seu aplicativo.
Observação
Se você não compilar seu aplicativo em um computador que tenha o IIS 7 instalado, será necessário copiar o arquivo HostedWebTest.exe para um computador que tenha o IIS 7 instalado antes de testar o aplicativo.
Para compilar e testar seu aplicativo
Compile o aplicativo:
No menu Compilar, clique em Compilar Solução.
Verifique se o Visual Studio não retornou erros ou avisos. Se você vir erros ou avisos, precisará resolve esses problemas antes de testar o projeto.
Abra o Windows Explorer e localize a pasta que você especificou ao criar o projeto C++.
Dependendo das opções de build, você deverá ver uma pasta chamada Depurar ou Liberar na pasta padrão do projeto.
Dentro da pasta Depurar ou Liberar , localize o arquivo chamado HostedWebTest.exe.
Verifique se o arquivo de configuração está na pasta apropriada para seu aplicativo. Por exemplo, o exemplo de código listado anteriormente neste passo a passo foi projetado para usar um arquivo chamado HostedWebTest.config que está localizado na pasta Inetsrv.
Abra a janela Prompt de Comando e altere os diretórios para o caminho em que o arquivo HostedWebTest.exe está localizado.
Digite HostedWebTest e pressione ENTER para iniciar o aplicativo.
Você deverá ver a saída do aplicativo que se assemelha ao seguinte:
DLL loaded successfully. WebCoreActivate successfully resolved. WebCoreShutdown successfully resolved. Activating the Web core... WebCoreActivate was successful. Press any key to continue...
Minimize a janela do Prompt de Comando sem pressionar teclas no teclado.
Dependendo das definições de configuração, você pode abrir um navegador da Web e navegar até o site definido no arquivo de configuração.
Quando terminar de navegar até o site, retorne à janela do Prompt de Comando e pressione a BARRA DE ESPAÇOS.
Você deverá ver a saída do aplicativo que se assemelha ao seguinte:
Shutting down the Web core... WebCoreShutdown was successful.
Solucionar erros
Se o aplicativo não for carregado ou retornar um erro quando estiver em execução, as etapas a seguir ajudarão você a diagnosticar alguns dos erros que você pode enfrentar.
Para solucionar erros em seu aplicativo
Se o aplicativo retornar o seguinte erro:
Could not load DLL. Error: 0x8007007e
Este é um ERROR_MOD_NOT_FOUND status. Esse erro indica que o arquivo Hwebcore.dll não pode ser localizado. Esse erro ocorrerá se o IIS não estiver instalado.
Se o aplicativo retornar o seguinte erro:
DLL loaded successfully. WebCoreActivate successfully resolved. WebCoreShutdown successfully resolved. Activating the Web core... WebCoreActivate failed. Error: 0x8007000d
Este é um ERROR_INVALID_DATA status. Esse erro indica que o arquivo de configuração não pode ser localizado ou contém erros. Você deve procurar no windows Visualizador de Eventos para obter descrições de erro adicionais.
Se o aplicativo retornar o seguinte erro:
DLL loaded successfully. WebCoreActivate successfully resolved. WebCoreShutdown successfully resolved. Activating the Web core... WebCoreActivate failed. Error: 0x800700b7
Este é um ERROR_ALREADY_EXISTS status. Esse erro indica que o arquivo de configuração foi carregado, mas contém informações duplicadas. Por exemplo, você pode ter definido mais de um pool de aplicativos ou pode ter criado associações de site duplicadas. Você deve examinar a Visualizador de Eventos do Windows para obter descrições de erro adicionais.
Se o aplicativo for carregado com êxito, mas você receber erros HTTP 404 ao navegar pelo site hospedado pelo aplicativo, examine os logs do IIS criados pelo aplicativo para os códigos de substatus 404. Aqui estão alguns dos códigos de substatus que você pode ver:
404.3 "Negado pelo Mapa mime"— Esse código de substatus indica que o tipo MIME de um recurso solicitado não está configurado corretamente. Por exemplo, você encontrará esse código se navegar até um arquivo que tenha uma extensão de nome de arquivo .txt e não tiver adicionado essa extensão ao mapa MIME no arquivo de configuração.
404.4 "Sem Manipulador"— Esse código de substatus indica que nenhum manipulador foi configurado para o recurso solicitado. Por exemplo, você encontrará esse código se navegar até um arquivo que tenha uma extensão de nome de arquivo .htm e não tiver adicionado o manipulador de arquivos estáticos ao arquivo de configuração.
404.7 "Extensão de Arquivo Negada"— Esse código de substatus indica que a extensão de nome de arquivo foi bloqueada pela filtragem de solicitação. Por exemplo, você encontrará esse código se navegar até um arquivo que tenha uma extensão de nome de arquivo .gif e a filtragem de solicitações tiver sido configurada para negar o acesso a arquivos que têm essa extensão.
Cada um desses erros indica um problema com as configurações no arquivo de configuração do aplicativo. Para obter mais informações, consulte Passo a passo: criando um arquivo de configuração para o Web Core hospedado.