#c #http #http-headers #iis-7.5 #ihttpmodule
#c #http #http-заголовки #iis-7.5 #ihttpmodule
Вопрос:
Я создал простой CHttpModule
, который добавляет пользовательский заголовок ко всем запросам:
#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>
class AppendHeaderModule : public CHttpModule {
public:
REQUEST_NOTIFICATION_STATUS
OnBeginRequest(
IN IHttpContext * pHttpContext,
IN IHttpEventProvider * pProvider
)
{
UNREFERENCED_PARAMETER(pProvider);
PCSTR testHeaderName = "Foo";
PCSTR testHeader = "bar";
pHttpContext->GetResponse()->SetHeader(testHeaderName, testHeader, (USHORT)strlen(testHeader), true);
return RQ_NOTIFICATION_CONTINUE;
}
VOID Terminate() {
delete this;
}
AppendHeaderModule() { }
~AppendHeaderModule() { }
};
class AppendHeaderModuleFactory : public IHttpModuleFactory {
public:
HRESULT
GetHttpModule(
OUT CHttpModule ** ppModule,
IN IModuleAllocator * pAllocator
)
{
UNREFERENCED_PARAMETER(pAllocator);
AppendHeaderModule* pModule = new AppendHeaderModule;
if (!pModule) {
return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
}
else {
*ppModule = pModule;
pModule = NULL;
return S_OK;
}
}
void Terminate() {
delete this;
}
};
HRESULT __stdcall
RegisterModule(
DWORD dwServerVersion,
IHttpModuleRegistrationInfo * pModuleInfo,
IHttpServer * pGlobalInfo
)
{
UNREFERENCED_PARAMETER(dwServerVersion);
UNREFERENCED_PARAMETER(pGlobalInfo);
AppendHeaderModuleFactory* pModule = new AppendHeaderModuleFactory;
if (pModule == NULL)
return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
return pModuleInfo->SetRequestNotifications(pModule, RQ_BEGIN_REQUEST, 0);
}
Я скопировал его C:WindowsSystem32inetsrv
, зарегистрировал модуль и добавил его в список. Однако я не вижу дополнительного заголовка ни в одном из моих запросов. Я создал аналогичный управляемый модуль, установил его в GAC, зарегистрировал, и он работает нормально. Но этот собственный модуль, похоже, ничего не делает. Требуется ли еще один шаг, чтобы заставить собственные модули обрабатывать запросы?
Кроме того, я не уверен, имеет ли это значение, но запросы направляются в ASP.NET сайт. Собственные обработчики не запускаются для ASP.NET ?
Ответ №1:
Если модуль является 32-разрядным модулем, вам необходимо включить 32-разрядные приложения в пул приложений для вашего веб-сайта. Перейдите в пулы приложений, выберите пул для своего веб-сайта, дополнительные настройки и установите для параметра «Включить 32-разрядные приложения» значение TRUE.