Compartir a través de


Tutorial: Creación de una aplicación principal hospedada

En este tutorial se muestra cómo crear una aplicación de consola de Windows que usa las características de Hosted Web Core que están disponibles en IIS 7.

La funcionalidad Hosted Web Core de IIS 7 permite crear una aplicación que cargue una instancia del núcleo de IIS, que es la aplicación web base y la funcionalidad de servicio de contenido proporcionada por IIS. Para obtener más información sobre Hosted Web Core, consulte Hosted Web Core API Reference (Referencia de la API de Núcleo web hospedado).

Debe proporcionar un archivo de configuración para la aplicación que sigue el formato del archivo ApplicationHost.config. Sin embargo, no debe usar el archivo ApplicationHost.config real, ya que puede contener configuraciones que entran en conflicto con la configuración del sitio web. Para obtener más información sobre cómo crear un archivo de configuración para la aplicación, vea Walkthrough: Creating a Configuration File for Hosted Web Core.

Las tareas que se ilustran en este tutorial son las siguientes:

  • Creación de un proyecto de C++ para la aplicación.

  • Agregar el código de C++ para la aplicación.

  • Compilar y probar la aplicación.

  • Solución de errores al usar la aplicación.

Requisitos previos

El siguiente software es necesario para completar los pasos del ejemplo:

  • IIS 7.

Nota

Aunque tendrá que ejecutar la aplicación Hosted Web Core en un equipo que tenga INSTALADO IIS 7, no tiene que compilar la aplicación de ejemplo en un equipo que tenga IIS 7 instalado. Puede compilar la aplicación en una versión diferente de Windows y, a continuación, copiarla en un equipo que tenga INSTALADO IIS 7.

  • Visual Studio 2005.

Nota:

También puede usar Visual Studio .NET 2003 o versiones anteriores, aunque es posible que los pasos del tutorial no sean idénticos.

Creación de una aplicación web principal hospedada

En esta parte del tutorial, creará un proyecto de aplicación de consola de C++ para la aplicación.

Para crear un proyecto de C++ para la aplicación

  1. Inicie Visual Studio 2005.

  2. Compruebe que las opciones globales tienen todas las rutas de acceso correctas a los archivos de inclusión del SDK:

    1. En el menú Herramientas , haga clic en Opciones.

      Se abre el cuadro de diálogo Options (Opciones).

    2. Expanda el nodo Proyectos y soluciones en la vista de árbol y, a continuación, haga clic en Directorios de VC++.

    3. En el cuadro Mostrar directorios para , seleccione Incluir archivos.

    4. Compruebe que aparece la ruta de acceso donde instaló los archivos de inclusión del SDK. Si la ruta de acceso no aparece, haga clic en el icono Nueva línea y agregue la ruta de acceso donde instaló los archivos de inclusión del SDK.

    5. Haga clic en OK.

  3. Cree un nuevo proyecto de C++:

    1. En el menú Archivo , elija Nuevoy haga clic en Proyecto.

      Aparece el cuadro de diálogo Nuevo proyecto .

    2. En el panel Tipos de proyecto , expanda el nodo Visual C++ y, a continuación, haga clic en Win32.

    3. En el panel Plantillas , haga clic en Proyecto Win32.

    4. En el cuadro Nombre , escriba HostedWebTest.

    5. En el cuadro Ubicación , escriba la ruta de acceso del proyecto.

    6. Haga clic en OK.

      Se abre el Asistente para aplicaciones Win32 .

    7. Haga clic en Configuración de la aplicación.

    8. En Tipo de aplicación, haga clic en Aplicación de consola.

    9. Haga clic en Finalizar

      Visual Studio abre el proyecto HostWebTest.cpp.

  4. Configure el proyecto para compilar mediante la __stdcall (/Gz) convención de llamada:

    1. En el menú Proyecto , haga clic en HostedWebTest Properties ( Propiedades de HostedWebTest).

    2. Expanda el nodo Propiedades de configuración en la vista de árbol, expanda el nodo C/C++ y, a continuación, haga clic en Avanzado.

    3. En el cuadro Configuración , seleccione Todas las configuraciones.

    4. En el cuadro Convención de llamada, seleccione __stdcall (/Gz).

    5. Haga clic en OK.

Agregar el código para la aplicación

En esta sección se muestra cómo reemplazar el código que se agregó automáticamente al archivo de C++ por código que ejecutará hosted Web Core.

Nota

En este ejemplo se busca un archivo denominado HostedWebTest.config en la carpeta Inetsrv. Puede modificar la ruta de acceso y el nombre de archivo, pero debe proporcionar un archivo de configuración válido. Para obtener más información sobre cómo crear un archivo de configuración para la aplicación, vea Walkthrough: Creating a Configuration File for Hosted Web Core.

Para agregar el código de C++ para la aplicación

  1. Abra el archivo HostedWebTest.cpp, si aún no está abierto y, a continuación, quite todo el código de C++ existente.

  2. Copie el siguiente código de C++ en el archivo:

    #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;
    }
    
  3. Guarde el archivo HostedWebTest.cpp.

Compilar y probar la aplicación

Después de crear y guardar el archivo de C++, el siguiente paso es compilar y probar la aplicación.

Nota:

Si no compila la aplicación en un equipo con IIS 7 instalado, tendrá que copiar el archivo HostedWebTest.exe en un equipo que tenga IIS 7 instalado antes de probar la aplicación.

Para compilar y probar la aplicación

  1. Compilar la aplicación:

    1. En el menú Compilar , haga clic en Compilar solución.

    2. Compruebe que Visual Studio no devolvió errores ni advertencias. Si ve errores o advertencias, tendrá que resolver esos problemas antes de probar el proyecto.

  2. Abra el Explorador de Windows y busque la carpeta que especificó al crear el proyecto de C++.

    En función de las opciones de compilación, debería ver una carpeta denominada Depurar o Liberar en la carpeta predeterminada del proyecto.

  3. Dentro de la carpeta Depurar o Liberar , busque el archivo denominado HostedWebTest.exe.

  4. Compruebe que el archivo de configuración está en la carpeta adecuada para la aplicación. Por ejemplo, el ejemplo de código enumerado anteriormente en este tutorial está diseñado para usar un archivo denominado HostedWebTest.config que se encuentra en la carpeta Inetsrv.

  5. Abra la ventana del símbolo del sistema y cambie los directorios a la ruta de acceso donde se encuentra el archivo HostedWebTest.exe.

  6. Escriba HostedWebTest y presione ENTRAR para iniciar la aplicación.

  7. Debería ver la salida de la aplicación similar a la siguiente:

    DLL loaded successfully.
    WebCoreActivate successfully resolved.
    WebCoreShutdown successfully resolved.
    Activating the Web core...
    WebCoreActivate was successful.
    Press any key to continue...
    
  8. Minimice la ventana del símbolo del sistema sin presionar ninguna tecla en el teclado.

  9. En función de los valores de configuración, puede abrir un explorador web y ir al sitio web que se define en el archivo de configuración.

  10. Cuando haya terminado de navegar al sitio web, vuelva a la ventana del símbolo del sistema y presione BARRA ESPACIADORA.

  11. Debería ver la salida de la aplicación similar a la siguiente:

    Shutting down the Web core...
    WebCoreShutdown was successful.
    

Solución de errores

Si la aplicación no se carga o devuelve un error cuando se está ejecutando, los pasos siguientes le ayudarán a diagnosticar algunos de los errores que puede experimentar.

Para solucionar errores en la aplicación

  • Si la aplicación devuelve el siguiente error:

    Could not load DLL.
    Error: 0x8007007e
    

    Se trata de un estado de ERROR_MOD_NOT_FOUND. Este error indica que no se puede encontrar el archivo Hwebcore.dll. Este error se producirá si IIS no está instalado.

  • Si la aplicación devuelve el siguiente error:

    DLL loaded successfully.
    WebCoreActivate successfully resolved.
    WebCoreShutdown successfully resolved.
    Activating the Web core...
    WebCoreActivate failed.
    Error: 0x8007000d
    

    Se trata de un estado de ERROR_INVALID_DATA. Este error indica que el archivo de configuración no se puede encontrar o contiene errores. Debería buscar en la Visor de eventos de Windows las descripciones de errores adicionales.

  • Si la aplicación devuelve el siguiente error:

    DLL loaded successfully.
    WebCoreActivate successfully resolved.
    WebCoreShutdown successfully resolved.
    Activating the Web core...
    WebCoreActivate failed.
    Error: 0x800700b7
    

    Se trata de un estado de ERROR_ALREADY_EXISTS. Este error indica que el archivo de configuración se cargó, pero contiene información duplicada. Por ejemplo, puede que haya definido más de un grupo de aplicaciones o que haya creado enlaces de sitio web duplicados. Debe examinar el Visor de eventos de Windows para obtener descripciones de errores adicionales.

  • Si la aplicación se carga correctamente, pero recibe errores HTTP 404 al examinar el sitio web hospedado por la aplicación, debe examinar los registros de IIS creados por la aplicación para los códigos de subestado 404. Estos son algunos de los códigos de subestado que puede ver:

    • 404.3 "Denegado por mime Map": este código de subestado indica que el tipo MIME de un recurso solicitado no está configurado correctamente. Por ejemplo, encontrará este código si va a un archivo que tiene una extensión de nombre de archivo .txt y no ha agregado esa extensión al mapa MIME en el archivo de configuración.

    • 404.4 "Sin controlador": este código de subestado indica que no se ha configurado ningún controlador para el recurso solicitado. Por ejemplo, encontrará este código si va a un archivo que tiene una extensión de nombre de archivo .htm y no ha agregado el controlador de archivos estáticos al archivo de configuración.

    • 404.7 "Extensión de archivo denegada": este código de subestado indica que la extensión de nombre de archivo se ha bloqueado mediante el filtrado de solicitudes. Por ejemplo, encontrará este código si busca un archivo que tiene una extensión de nombre de archivo .gif y se ha configurado el filtrado de solicitudes para denegar el acceso a los archivos que tienen esa extensión.

      Cada uno de estos errores indica un problema con la configuración del archivo de configuración de la aplicación. Para obtener más información, vea Tutorial: Creación de un archivo de configuración para el núcleo web hospedado.

Consulte también