Пошаговое руководство. Создание размещенного веб-приложения
В этом пошаговом руководстве показано, как создать консольное приложение Windows, использующее функции Hosted Web Core, доступные в IIS 7.
Функциональные возможности Hosted Web Core в IIS 7 позволяют создать приложение, которое загружает экземпляр ядра IIS, который является базовым веб-приложением и функциями обслуживания содержимого, предоставляемыми СЛУЖБАми IIS. Дополнительные сведения о размещенной веб-части см. в справочнике по API hosted Web Core.
Необходимо предоставить файл конфигурации для приложения в формате файла ApplicationHost.config. Однако не следует использовать фактический файл ApplicationHost.config, так как он может содержать параметры, конфликтующие с параметрами веб-сайта. Дополнительные сведения о создании файла конфигурации для приложения см. в разделе Пошаговое руководство. Создание файла конфигурации для размещенного веб-ядра.
В данном пошаговом руководстве представлены следующие задачи:
Создание проекта C++ для приложения.
Добавление кода C++ для приложения.
Компиляция и тестирование приложения.
Устранение ошибок при использовании приложения.
Предварительные требования
Для выполнения действий, описанных в примере, требуется следующее программное обеспечение:
- IIS 7.
Примечание
Хотя вам потребуется запустить приложение Hosted Web Core на компьютере с установленными службами IIS 7, не нужно компилировать пример приложения на компьютере с установленными службами IIS 7. Вы можете скомпилировать приложение в другой версии Windows, а затем скопировать его на компьютер с установленными службами IIS 7.
- Visual Studio 2005.
Примечание
Вы также можете использовать Visual Studio .NET 2003 или более ранней версии, хотя пошаговые инструкции могут быть не идентичными.
Создание размещенного веб-приложения
В этой части пошагового руководства вы создадите проект консольного приложения C++ для своего приложения.
Создание проекта C++ для приложения
Запустите Visual Studio 2005.
Убедитесь, что глобальные параметры содержат все правильные пути к пакету SDK, включая файлы:
В меню Сервис выберите пункт Параметры.
Откроется диалоговое окно Параметры.
Разверните узел Проекты и решения в древовидном представлении и щелкните Каталоги VC++.
В поле Показать каталоги для выберите Включить файлы.
Убедитесь, что указан путь, по которому вы установили включаемые файлы пакета SDK. Если путь отсутствует в списке, щелкните значок Создать строку и добавьте путь, по которому вы установили файлы пакета SDK.
Нажмите кнопку ОК.
Создайте проект C++:
В меню Файл укажите Создать, затем нажмите Проект.
Откроется диалоговое окно Новый проект .
В области Типы проектов разверните узел Visual C++ и щелкните Win32.
В области Шаблоны щелкните Проект Win32.
В поле Имя введите HostedWebTest.
В поле Расположение введите путь к проекту.
Нажмите кнопку ОК.
Откроется мастер приложений Win32 .
Щелкните Параметры приложения.
В разделе Тип приложения щелкните Консольное приложение.
Нажмите кнопку Готово.
Visual Studio открывает проект HostWebTest.cpp.
Настройте проект для компиляции с помощью соглашения о вызовах
__stdcall (/Gz)
:В меню Проект выберите HostedWebTest Properties (Свойства HostedWebTest).
Разверните узел Свойства конфигурации в представлении дерева, узел C/C++ и нажмите кнопку Дополнительно.
В поле Конфигурация выберите Все конфигурации.
В поле Соглашение о вызовах выберите __stdcall (/Gz).
Нажмите кнопку ОК.
Добавление кода для приложения
В этом разделе показано, как заменить код, который был автоматически добавлен в файл C++, кодом, который будет выполнять размещенное веб-ядро.
Примечание
В этом примере выполняется поиск файла с именем HostedWebTest.config в папке Inetsrv. Вы можете изменить путь и имя файла, но необходимо предоставить допустимый файл конфигурации. Дополнительные сведения о создании файла конфигурации для приложения см. в разделе Пошаговое руководство. Создание файла конфигурации для размещенного веб-ядра.
Добавление кода C++ для приложения
Откройте файл HostedWebTest.cpp, если он еще не открыт, а затем удалите весь существующий код C++.
Скопируйте следующий код C++ в файл:
#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; }
Сохраните файл HostedWebTest.cpp.
Компиляция и тестирование приложения
После создания и сохранения файла C++ следующим шагом является компиляция и тестирование приложения.
Примечание
Если приложение не компилируется на компьютере с установленными службами IIS 7, перед тестированием приложения потребуется скопировать файл HostedWebTest.exe на компьютер с установленными службами IIS 7.
Компиляция и тестирование приложения
Скомпилируйте приложение:
В меню Сборка выберите Собрать решение.
Убедитесь, что Visual Studio не вернул никаких ошибок или предупреждений. Если вы видите ошибки или предупреждения, необходимо устранить эти проблемы перед тестированием проекта.
Откройте Обозреватель Windows и найдите папку, указанную при создании проекта C++.
В зависимости от параметров сборки в папке по умолчанию для проекта должна появиться папка с именем Debug или Release .
В папке Отладка или Выпуск найдите файл с именем HostedWebTest.exe.
Убедитесь, что файл конфигурации находится в соответствующей папке для приложения. Например, пример кода, приведенный ранее в этом пошаговом руководстве, предназначен для использования файла с именем HostedWebTest.config, который находится в папке Inetsrv.
Откройте окно командной строки и измените каталоги на путь, по которому находится файл HostedWebTest.exe.
Введите HostedWebTest и нажмите клавишу ВВОД, чтобы запустить приложение.
Вы должны увидеть выходные данные приложения, которые выглядят примерно так:
DLL loaded successfully. WebCoreActivate successfully resolved. WebCoreShutdown successfully resolved. Activating the Web core... WebCoreActivate was successful. Press any key to continue...
Свернуть окно командной строки без нажатия клавиш на клавиатуре.
В зависимости от параметров конфигурации можно открыть веб-браузер и перейти на веб-сайт, определенный в файле конфигурации.
Завершив переход на веб-сайт, вернитесь в окно командной строки и нажмите клавишу ПРОБЕЛ.
Вы должны увидеть выходные данные приложения, которые выглядят примерно так:
Shutting down the Web core... WebCoreShutdown was successful.
Устранение ошибок
Если приложение не загружается или возвращает ошибку при выполнении, следующие действия помогут диагностировать некоторые из ошибок, которые могут возникнуть.
Устранение ошибок в приложении
Если приложение возвращает следующую ошибку:
Could not load DLL. Error: 0x8007007e
Это состояние ERROR_MOD_NOT_FOUND. Эта ошибка указывает, что не удается найти файл Hwebcore.dll. Эта ошибка возникает, если службы IIS не установлены.
Если приложение возвращает следующую ошибку:
DLL loaded successfully. WebCoreActivate successfully resolved. WebCoreShutdown successfully resolved. Activating the Web core... WebCoreActivate failed. Error: 0x8007000d
Это состояние ERROR_INVALID_DATA. Эта ошибка означает, что файл конфигурации не может быть найден или содержит ошибки. Дополнительные описания ошибок следует найти в Просмотр событий Windows.
Если приложение возвращает следующую ошибку:
DLL loaded successfully. WebCoreActivate successfully resolved. WebCoreShutdown successfully resolved. Activating the Web core... WebCoreActivate failed. Error: 0x800700b7
Это состояние ERROR_ALREADY_EXISTS. Эта ошибка указывает на то, что файл конфигурации был загружен, но содержит повторяющиеся сведения. Например, вы могли определить несколько пулов приложений или создать повторяющиеся привязки веб-сайта. Дополнительные описания ошибок следует изучить в Просмотр событий Windows.
Если приложение загружается успешно, но при просмотре веб-сайта, размещенного в приложении, возникают ошибки HTTP 404, следует изучить журналы IIS, созданные приложением, на наличие кодов подсостояния 404. Ниже приведены некоторые коды подсостояния, которые могут отображаться:
404.3 "Отказано по схеме Mime" — этот код подсостояние указывает, что тип MIME для запрошенного ресурса настроен неправильно. Например, вы столкнетесь с этим кодом, если вы переходите к файлу с расширением имени файла .txt и не добавили это расширение в карту MIME в файле конфигурации.
404.4 "Нет обработчика" — этот код подсостоятеля указывает, что обработчик не настроен для запрошенного ресурса. Например, вы столкнетесь с этим кодом, если вы переходите к файлу с расширением имени .htm и не добавили статический обработчик файлов в файл конфигурации.
404.7 "Отказано в расширении файла" — этот код подсостояния указывает, что расширение имени файла было заблокировано путем фильтрации запросов. Например, вы столкнетесь с этим кодом, если перейти к файлу с расширением имени файла .gif и настроить фильтрацию запросов, чтобы запретить доступ к файлам с этим расширением.
Каждая из этих ошибок указывает на проблему с параметрами в файле конфигурации приложения. Дополнительные сведения см. в разделе Пошаговое руководство. Создание файла конфигурации для размещенного веб-ядра.