本机IIS7.5模块未运行

时间:2014-06-27 12:50:30

标签: c++ http http-headers 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:\Windows\System32\inetsrv,注册了该模块,并将其添加到列表中。但是,我没有在我的任何请求中看到额外的标头。我创建了一个类似的托管模块,将其安装到GAC,注册它,它工作正常。但是这个原生模块似乎什么都不做。是否需要另一个步骤才能使本机模块处理请求?

另外,我不确定它是否重要,但是请求是在ASP.NET站点上发出的。本机处理程序不能运行ASP.NET吗?

1 个答案:

答案 0 :(得分:0)

如果模块是32位模块,则需要在网站的应用程序池中启用32位应用程序。转到应用程序池,选择您网站的池,高级设置并设置“启用32位应用程序为TRUE。