Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом пошаговом руководстве показано, как создать консольное приложение Windows, использующее функции размещенного веб-ядра, доступные в IIS 7.
Функциональность хостируемого веб-ядра в IIS 7 позволяет создавать приложение, загружая экземпляр ядра IIS, который предоставляет базовые функции веб-приложения и обслуживания контента, обеспечиваемые IIS. Для получения дополнительной информации о размещённом веб-ядре см. справочник по API Hosted Web Core.
Необходимо предоставить файл конфигурации для приложения, который соответствует формату файла ApplicationHost.config. Однако не следует использовать фактический файл ApplicationHost.config, так как он может содержать параметры, конфликтующие с параметрами веб-сайта. Дополнительные сведения о создании файла конфигурации для приложения см. в пошаговом руководстве по созданию файла конфигурации для размещенного веб-ядра.
Задачи, показанные в этом пошаговом руководстве, включают следующие:
Создание проекта C++ для приложения.
Добавление кода C++ для приложения.
Компиляция и тестирование приложения.
Устранение ошибок при использовании приложения.
Необходимые условия
Для выполнения действий, описанных в примере, требуется следующее программное обеспечение:
- IIS 7.
Замечание
Хотя вам придется запустить размещенное веб-ядро приложения на компьютере, на котором установлена служба IIS 7, вам не нужно компилировать пример приложения на компьютере, на котором установлена служба IIS 7. Вы можете скомпилировать приложение в другой версии Windows, а затем скопировать приложение на компьютер, на котором установлена служба IIS 7.
- Visual Studio 2005.
Замечание
Вы также можете использовать Visual Studio .NET 2003 или более ранних версий, хотя пошаговое руководство может не совпадать.
Создание размещенного веб-приложения Core
В этой части пошагового руководства вы создадите проект консольного приложения C++ для приложения.
Создание проекта C++ для приложения
Запустите Visual Studio 2005.
Убедитесь, что в глобальных параметрах указаны все правильные пути к файлам заголовков SDK:
В меню Сервис выберите пункт Параметры.
Откроется диалоговое окно "Параметры ".
Разверните узел "Проекты и решения " в представлении дерева и выберите каталоги VC++.
В поле "Показать каталоги" выберите "Включить файлы".
Убедитесь, что путь, по которому вы установили SDK, перечислен и содержит необходимые файлы включения. Если путь не указан, щелкните значок "Новая строка" и добавьте путь к файлам include SDK, установленным вами.
Нажмите кнопку ОК.
Создайте проект C++ :
В меню Файл выберите пункт Создать и затем пункт Проект.
Откроется диалоговое окно "Новый проект ".
В области "Типы проектов " разверните узел Visual C++ и нажмите кнопку Win32.
В области "Шаблоны " щелкните "Проект Win32".
В поле "Имя" введите HostedWebTest.
В поле "Расположение " введите путь для проекта.
Нажмите кнопку ОК.
Откроется мастер приложений Win32 .
Щелкните "Параметры приложения".
В разделе "Тип приложения" щелкните консольное приложение.
Нажмите кнопку "Готово".
Visual Studio открывает проект HostWebTest.cpp.
Настройте проект для компиляции с помощью соглашения о вызовах
__stdcall (/Gz):В меню "Проект" щелкните HostedWebTest Properties.
Разверните узел свойств конфигурации в представлении дерева, разверните узел 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 файла, а фильтрация запросов настроена для запрета доступа к файлам с этим расширением.
Каждая из этих ошибок указывает на проблему с параметрами в файле конфигурации приложения. Дополнительные сведения см. в пошаговом руководстве по созданию файла конфигурации для размещенного веб-ядра.