1

I've created a simple CHttpModule that adds a custom header to all requests:

#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);
}

I've copied it to C:\Windows\System32\inetsrv, registered the module, and added it to the list. However, I'm not seeing the additional header in any of my requests. I created a similar managed module, installed it to the GAC, registered it, and it works fine. But this native module seems to do nothing. Is there another step required to get native modules to handle requests?

Also, I'm not sure if it matters, but the requests are being made to an ASP.NET site. Do native handlers not run for ASP.NET?

4

1 回答 1

0

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

于 2014-08-08T23:15:12.527 回答