CGlobalModule::OnGlobalConfigurationChange Method

Represents the method that will handle a GlobalConfigurationChange event, which occurs when a change is made to a configuration file.

Syntax

virtual GLOBAL_NOTIFICATION_STATUS OnGlobalConfigurationChange(  
   IN IGlobalConfigurationChangeProvider* pProvider  
);  

Parameters

pProvider
[IN] A pointer to an IGlobalConfigurationChangeProvider interface.

Return Value

A GLOBAL_NOTIFICATION_STATUS value.

Remarks

When a global module has registered for the GL_CONFIGURATION_CHANGE event notification, IIS will call the module's OnGlobalConfigurationChange method if a configuration file is changed. For example, if the ApplicationHost.config file is changed, an event containing the configuration path will be written to the Event Viewer.

Note

Global modules can register for the GlobalConfigurationChange event notification by registering for GL_CONFIGURATION_CHANGE in the module's RegisterModule function.

Example

The following code example demonstrates how to create a global-level HTTP module that uses the IGlobalConfigurationChangeProvider::GetChangePath method to retrieve the path for a configuration change and add a log entry to the Event Viewer.

#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>

// Create the module's global class.
class MyGlobalModule : public CGlobalModule
{
public:
    GLOBAL_NOTIFICATION_STATUS
    OnGlobalConfigurationChange(
        IN IGlobalConfigurationChangeProvider * pProvider
    )
    {
        UNREFERENCED_PARAMETER( pProvider );
        
        // Test for an error.
        if (NULL != m_pHttpContext)
        {
            // Retrieve the path that has changed.
            PCWSTR pwszChangePath = NULL;
            pwszChangePath = pProvider->GetChangePath();
            // Test for an error.
            if (NULL != pwszChangePath)
            {
                // Allocate storage for the path.
                char * pszChangePath =
                    (char *) m_pHttpContext->AllocateRequestMemory(
                    (DWORD) wcslen(pwszChangePath)+1 );
                // Test for an error.
                if (NULL != pszChangePath)
                {
                    // Convert the path.
                    wcstombs(pszChangePath,pwszChangePath,
                        wcslen(pwszChangePath));
                    // Create an array of strings.
                    LPCSTR szBuffer[2] = {"Path Changed"};
                    // Store the path.
                    szBuffer[1] = pszChangePath;
                    // Write the strings to the Event Viewer.
                    WriteEventViewerLog(szBuffer,2);
                }
            }
        }
        // Return processing to the pipeline.
        return GL_NOTIFICATION_CONTINUE;
    }

    GLOBAL_NOTIFICATION_STATUS
    OnGlobalPreBeginRequest(
        IN IPreBeginRequestProvider * pProvider
    )
    {
        UNREFERENCED_PARAMETER( pProvider );
        // Retrieve a pointer to the context.
        m_pHttpContext = pProvider->GetHttpContext();
        // Return processing to the pipeline.
        return GL_NOTIFICATION_CONTINUE;
    }

    VOID Terminate()
    {
        // Remove the class from memory.
        delete this;
    }

    MyGlobalModule()
    {
        // Open a handle to the Event Viewer.
        MyGlobalModule::m_hEventLog = RegisterEventSource( NULL,"IISADMIN" );
        // Initialize the context pointer to NULL.
        MyGlobalModule::m_pHttpContext = NULL;
    }

    ~MyGlobalModule()
    {
        // Test whether the handle for the Event Viewer is open.
        if (NULL != MyGlobalModule::m_hEventLog)
        {
            DeregisterEventSource( MyGlobalModule::m_hEventLog );
            MyGlobalModule::m_hEventLog = NULL;
            MyGlobalModule::m_pHttpContext = NULL;
        }
    }

private:

    // Create a handle for the event viewer.
    HANDLE m_hEventLog;
    // Create a pointer for the module context.
    IHttpContext * m_pHttpContext;

    // Define a method that writes to the Event Viewer.
    BOOL WriteEventViewerLog(LPCSTR szBuffer[], WORD wNumStrings)
    {
        // Test whether the handle for the Event Viewer is open.
        if (NULL != MyGlobalModule::m_hEventLog)
        {
            // Write any strings to the Event Viewer and return.
            return ReportEvent(
                MyGlobalModule::m_hEventLog,
                EVENTLOG_INFORMATION_TYPE,
                0, 0, NULL, wNumStrings,
                0, szBuffer, NULL );
        }
        return FALSE;
    }
};

// Create the module's exported registration function.
HRESULT
__stdcall
RegisterModule(
    DWORD dwServerVersion,
    IHttpModuleRegistrationInfo * pModuleInfo,
    IHttpServer * pGlobalInfo
)
{
    UNREFERENCED_PARAMETER( dwServerVersion );
    UNREFERENCED_PARAMETER( pGlobalInfo );

    // Create an instance of the global module class.
    MyGlobalModule * pGlobalModule = new MyGlobalModule;
    // Test for an error.
    if (NULL == pGlobalModule)
    {
        return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
    }
    // Set the global notifications and exit.
    return pModuleInfo->SetGlobalNotifications(
        pGlobalModule,
        GL_CONFIGURATION_CHANGE | GL_PRE_BEGIN_REQUEST );
}

Your module must export the RegisterModule function. You can export this function by creating a module definition (.def) file for your project, or you can compile the module by using the /EXPORT:RegisterModule switch. For more information, see Walkthrough: Creating a Global-Level HTTP Module By Using Native Code.

You can optionally compile the code by using the __stdcall (/Gz) calling convention instead of explicitly declaring the calling convention for each function.

Requirements

Type Description
Client - IIS 7.0 on Windows Vista
- IIS 7.5 on Windows 7
- IIS 8.0 on Windows 8
- IIS 10.0 on Windows 10
Server - IIS 7.0 on Windows Server 2008
- IIS 7.5 on Windows Server 2008 R2
- IIS 8.0 on Windows Server 2012
- IIS 8.5 on Windows Server 2012 R2
- IIS 10.0 on Windows Server 2016
Product - IIS 7.0, IIS 7.5, IIS 8.0, IIS 8.5, IIS 10.0
- IIS Express 7.5, IIS Express 8.0, IIS Express 10.0
Header Httpserv.h

See Also

CGlobalModule Class
IGlobalConfigurationChangeProvider Interface