Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом пошаговом руководстве показано, как использовать C++ для создания примера http-модуля уровня запроса, реализующего новую архитектуру обработки запросов в IIS 7. Эта новая архитектура расширяет возможности программирования на нативном коде при разработке приложений IIS, когда используются более ранние версии ASP.NET, модули HTTP и фильтры или расширения ISAPI. Дополнительные сведения о проектировании модулей HTTP с использованием новой архитектуры обработки запросов см. в "Проектирование модулей HTTP в собственном коде".
В этом пошаговом руководстве вы создадите проект C++ для модуля HTTP, добавьте необходимый код для проекта Hello World, а затем скомпилируйте и протестируйте модуль.
Необходимые условия
Для выполнения действий, описанных в примере, требуется следующее программное обеспечение:
IIS 7.
Visual Studio 2005.
Комплект средств разработки программного обеспечения Windows (SDK).
Примечание Вы можете использовать Visual Studio .NET 2003 или более ранних версий, хотя пошаговое руководство может не совпадать.
Создание модуля
В этой части пошагового руководства вы создадите пустой проект DLL C++ для модуля HTTP.
Создание проекта библиотеки DLL C++
Откройте Visual Studio 2005.
Убедитесь, что в глобальных параметрах указаны все правильные пути доступа к файлам включения SDK.
В меню Сервис выберите пункт Параметры.
Разверните узел "Проекты и решения " в представлении дерева и выберите каталоги VC++.
В раскрывающемся списке " Показать каталоги" выберите "Включить файлы".
Убедитесь, что путь, в котором вы установили файлы включения SDK для Windows, указан в списке. Если путь не указан, щелкните значок "Новая строка" и добавьте путь к файлам include SDK, установленным вами. Каталог установки по умолчанию — $(VCInstallDir)PlatformSDK\bin.
Нажмите кнопку ОК.
Создайте проект C++ :
В меню Файл выберите пункт Создать и затем пункт Проект.
Откроется диалоговое окно "Новый проект ".
В области "Типы проектов " разверните узел Visual C++ и нажмите кнопку Win32.
В области "Шаблоны " выберите "Проект Win32".
В поле "Имя" введите HelloWorld.
В поле "Расположение " введите путь для примера.
Нажмите кнопку ОК.
Откроется мастер приложений Win32 .
Щелкните "Параметры приложения".
В разделе "Тип приложения" щелкните DLL.
В разделе "Дополнительные параметры" нажмите кнопку "Пустой проект".
Нажмите кнопку "Готово".
Добавление кода и исходных файлов
Следующим шагом является добавление необходимых файлов C++ и модулей-определений в проект.
Добавление исходных файлов в проект
Создайте файл определения модуля для экспорта функции RegisterModule :
В обозревателе решений щелкните правой кнопкой мыши исходные файлы, наведите указатель мыши на добавление и нажмите кнопку "Создать элемент".
Откроется диалоговое окно "Добавить новый элемент ".
Разверните узел Visual C++ в области категорий и нажмите кнопку "Код".
В области шаблонов выберите шаблон файла Module-Definition.
В поле "Имя" введите HelloWorld и оставьте путь по умолчанию для файла в поле "Расположение ".
Нажмите кнопку Добавить.
Добавление строки с
EXPORTSиRegisterModule. Файл должен выглядеть следующим образом:LIBRARY"HelloWorld" EXPORTS RegisterModuleЗамечание
Вместо создания файла определения модуля можно экспортировать функцию RegisterModule с помощью переключателя /EXPORT:RegisterModule .
Создайте файл C++ :
В обозревателе решений щелкните правой кнопкой мыши исходные файлы, наведите указатель мыши на добавление и нажмите кнопку "Создать элемент".
Откроется диалоговое окно "Добавить новый элемент ".
Разверните узел Visual C++ в области категорий и нажмите кнопку "Код".
В области "Шаблоны " выберите шаблон файла C++ .
В поле "Имя" введите HelloWorld и оставьте путь по умолчанию для файла в поле "Расположение ".
Нажмите кнопку Добавить.
Добавьте следующий код:
#define _WINSOCKAPI_ #include <windows.h> #include <sal.h> #include <httpserv.h> // Create the module class. class CHelloWorld : public CHttpModule { public: REQUEST_NOTIFICATION_STATUS OnBeginRequest( IN IHttpContext * pHttpContext, IN IHttpEventProvider * pProvider ) { UNREFERENCED_PARAMETER( pProvider ); // Create an HRESULT to receive return values from methods. HRESULT hr; // Retrieve a pointer to the response. IHttpResponse * pHttpResponse = pHttpContext->GetResponse(); // Test for an error. if (pHttpResponse != NULL) { // Clear the existing response. pHttpResponse->Clear(); // Set the MIME type to plain text. pHttpResponse->SetHeader( HttpHeaderContentType,"text/plain", (USHORT)strlen("text/plain"),TRUE); // Create a string with the response. PCSTR pszBuffer = "Hello World!"; // Create a data chunk. HTTP_DATA_CHUNK dataChunk; // Set the chunk to a chunk in memory. dataChunk.DataChunkType = HttpDataChunkFromMemory; // Buffer for bytes written of data chunk. DWORD cbSent; // Set the chunk to the buffer. dataChunk.FromMemory.pBuffer = (PVOID) pszBuffer; // Set the chunk size to the buffer size. dataChunk.FromMemory.BufferLength = (USHORT) strlen(pszBuffer); // Insert the data chunk into the response. hr = pHttpResponse->WriteEntityChunks( &dataChunk,1,FALSE,TRUE,&cbSent); // Test for an error. if (FAILED(hr)) { // Set the HTTP status. pHttpResponse->SetStatus(500,"Server Error",0,hr); } // End additional processing. return RQ_NOTIFICATION_FINISH_REQUEST; } // Return processing to the pipeline. return RQ_NOTIFICATION_CONTINUE; } }; // Create the module's class factory. class CHelloWorldFactory : public IHttpModuleFactory { public: HRESULT GetHttpModule( OUT CHttpModule ** ppModule, IN IModuleAllocator * pAllocator ) { UNREFERENCED_PARAMETER( pAllocator ); // Create a new instance. CHelloWorld * pModule = new CHelloWorld; // Test for an error. if (!pModule) { // Return an error if the factory cannot create the instance. return HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY ); } else { // Return a pointer to the module. *ppModule = pModule; pModule = NULL; // Return a success status. return S_OK; } } void Terminate() { // Remove the class from memory. delete this; } }; // Create the module's exported registration function. HRESULT __stdcall RegisterModule( DWORD dwServerVersion, IHttpModuleRegistrationInfo * pModuleInfo, IHttpServer * pGlobalInfo ) { UNREFERENCED_PARAMETER( dwServerVersion ); UNREFERENCED_PARAMETER( pGlobalInfo ); // Set the request notifications and exit. return pModuleInfo->SetRequestNotifications( new CHelloWorldFactory, RQ_BEGIN_REQUEST, 0 ); }
Компиляция и тестирование модуля
Компиляция и тестирование проекта
Скомпилируйте модуль HTTP:
В меню Сборка выберите Построить решение.
Убедитесь, что Visual Studio не вернул никаких ошибок или предупреждений.
Добавьте модуль HelloWorld.dll (с полным путем) в
globalModulesраздел %windir%\system32\inetsrv\config\applicationHost.config файла.
Перейдите на веб-сайт с помощью Internet Explorer; Вы увидите "Пример начала запроса" с отображаемым числом запросов.
Замечание
Прежде чем связать проект с последующими сборками, необходимо остановить IIS.
Устранение неполадок с настройками
Если модуль не компилируется или не работает должным образом, вот несколько областей, которые можно проверить:
Убедитесь, что вы указали
__stdcallдля экспортированных функций или настроили компиляцию с помощью соглашения о вызовах__stdcall (/Gz).Убедитесь, что IIS загрузил HelloWorld.dll.
В диспетчере IIS щелкните веб-сайт по умолчанию на панели "Подключения ".
В рабочей области (центральная область) выберите представление компонентов.
В поле "Группа" выберите "Категория".
В категории "Компоненты сервера " дважды щелкните модули.
Убедитесь, что указан модуль HelloWorld.
Убедитесь, что вы добавили правильный
RegisterModuleэкспорт в файл определения.Убедитесь, что вы добавили файл определения в параметры проекта. Чтобы добавить файл в параметры проекта, выполните следующие действия.
В меню проекта щелкните Свойства.
Разверните узел свойств конфигурации в представлении дерева, разверните узел компоновщика и нажмите кнопку "Входные данные".
Для параметров файла определения модуля убедитесь, что ваш файл определения перечислен.
См. также
Создание модулей HTTP Native-Code
Проектирование модулей HTTP Native-Code