ISAPI Extension
1.使用MFC的
1.1使用VS2003,建MFC Extension Dll项目
1.2修改MessageMap
BEGIN_PARSE_MAP(CMyConfigExtension, CHttpServer)
// TODO: insert your ON_PARSE_COMMAND() and
// ON_PARSE_COMMAND_PARAMS() here to hook up your commands.
// For example:
ON_PARSE_COMMAND(Default, CMyConfigExtension, ITS_EMPTY)
ON_PARSE_COMMAND(LoadXml, CMyConfigExtension, ITS_EMPTY)
ON_PARSE_COMMAND(LoadXml2, CMyConfigExtension, ITS_EMPTY)
ON_PARSE_COMMAND(LoadXml3, CMyConfigExtension, ITS_EMPTY)
DEFAULT_PARSE_COMMAND(Default, CMyConfigExtension)
END_PARSE_MAP(CMyConfigExtension)
1.3实现方法
void CMyConfigExtension::LoadXml(CHttpServerContext* pCtxt)
{
HRESULT hr;
CoInitialize(NULL);
//MSXML2::IXMLDocument2Ptr spXMLDOM;
CComPtr<IXMLDOMDocument> spXMLDOM;
hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
if ( FAILED(hr) ) throw "f";
if ( spXMLDOM.p == NULL ) throw "f0";
VARIANT_BOOL bSuccess = false;
hr = spXMLDOM->load(CComVariant(L"c://my//config//ClusterConfig.xml"),&bSuccess);
if ( FAILED(hr) )
throw "f1";
if ( !bSuccess )
throw "f2";
StartContent(pCtxt);
WriteTitle(pCtxt);
*pCtxt << _T("This default message was produced by the Internet");
*pCtxt << _T(" Server DLL Wizard. Edit your CMyConfigExtension::Default()");
*pCtxt << _T(" implementation to change it./r/n");
EndContent(pCtxt);
CoUninitialize();
}
void CMyConfigExtension::LoadXml2(CHttpServerContext* pCtxt)
{
MSXML2::IXMLDOMDocument2Ptr spDocument;
spDocument.CreateInstance(__uuidof(MSXML2::FreeThreadedDOMDocument));
// Load the file
VARIANT_BOOL fLoaded = spDocument->load("c://my//config/clusterconfig.xml");
StartContent(pCtxt);
WriteTitle(pCtxt);
*pCtxt << _T("This default message was produced by the Internet");
*pCtxt << _T(" Server DLL Wizard. Edit your CMyConfigExtension::Default()");
*pCtxt << _T(" implementation to change it./r/n");
EndContent(pCtxt);
}
ISAPI扩展到这里编程就已经实现了,执行使用http://localhost/name.dll?LoadXml
需要执行也还有一些配置要做,把Dll copy到指定目录,然后要确保该dll可以被允许执行
因为使用了MSXML2的com,所以在前面要加上#import <msxml3.dll>
方法解释:
void CMyConfigExtension::LoadXml(CHttpServerContext* pCtxt)
这里使用的是标准的com初始化方法
void CMyConfigExtension::LoadXml2(CHttpServerContext* pCtxt)
这里使用的是Smart Pointer,所以不需要显式的初始化
2.使用C的
#define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
#include <httpext.h>
#include <stdio.h>
extern "C" DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK pECB)
{
DWORD dwBytes;
char HeaderBuff[256];
LPSTR BodyBuff="<html><head></head><body>Hello World</body></html>";
sprintf(HeaderBuff,"Content-Type: text/html/r/nContent-Length: %d/r/n/r/n",strlen(BodyBuff));
dwBytes = strlen(HeaderBuff);
pECB->ServerSupportFunction(pECB->ConnID,HSE_REQ_SEND_RESPONSE_HEADER,NULL,&dwBytes,(LPDWORD)HeaderBuff);
dwBytes = strlen(BodyBuff);
pECB->WriteClient(pECB->ConnID,(LPVOID)BodyBuff,&dwBytes,0);
return HSE_STATUS_SUCCESS;
}
extern "C" BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO* pVer)
{
return TRUE;
}
extern "C" BOOL WINAPI TerminateExtension(DWORD dwFlags)
{
return TRUE;
}