写了一个ISAPI的筛选器 基于IP的筛选
之前实现的功能是 根据来访者的IP和本地的一个txt文件比较,如果本地文件包含了这个IP 就允许访问.否则就拒绝访问现在要实现的是
根据来访者的IP和某IIS服务器上的一个文件比较..如果远程的那个文件包含这个IP 就允许访问,否则就拒绝访问..我现在的思路是通过 MSXML2 的办法去获取远程文件的源码到本地文件...然后再进行之前的那种本地校验现在获取远程源码到本地在单个的程序中已经实现了...
但是将代码整到ISAPI里面就无法实现...附上CPP代码
// IPISAPI.CPP - Implementation file for your Internet Server
//    IPISAPI Filter#include "stdafx.h"
#include "IPISAPI.h"
#import "msxml.dll"
#import "msxml2.dll"
#include <string>
///////////////////////////////////////////////////////////////////////
// The one and only CWinApp object
// NOTE: You may remove this object if you alter your project to no
// longer use MFC in a DLL.CWinApp theApp;using namespace MSXML2;
CString bstrtbody;
int main(int argc, char* argv[])
{
CoInitialize(NULL);{
IXMLHTTPRequestPtr xmlrequest;
xmlrequest.CreateInstance("Msxml2.XMLHTTP");
_variant_t varp(false);
xmlrequest->open(_bstr_t("GET"),_bstr_t("http://yy.hhvod.com/ip.asp"),varp);
xmlrequest->send();
BSTR bstrbody;
xmlrequest->get_responseText(&bstrbody);
_bstr_t bstrtbody(bstrbody);
//printf("%s\n",(LPCTSTR)bstrtbody);
CStdioFile   file;  file.Open("C:\\BlockIP.txt",CFile::modeReadWrite|CFile::typeText);
file.WriteString((LPCTSTR)bstrtbody);
}
CoUninitialize();
return 0;
}
///////////////////////////////////////////////////////////////////////
// The one and only CIPISAPIFilter objectCIPISAPIFilter theFilter;
///////////////////////////////////////////////////////////////////////
// CIPISAPIFilter implementationCIPISAPIFilter::CIPISAPIFilter()
{
}CIPISAPIFilter::~CIPISAPIFilter()
{
}
BOOL CIPISAPIFilter::GetFilterVersion(PHTTP_FILTER_VERSION pVer)
{
// Call default implementation for initialization
CHttpFilter::GetFilterVersion(pVer); // Clear the flags set by base class
pVer->dwFlags &= ~SF_NOTIFY_ORDER_MASK; // Set the flags we are interested in
pVer->dwFlags |= SF_NOTIFY_ORDER_LOW | SF_NOTIFY_SECURE_PORT | SF_NOTIFY_NONSECURE_PORT
 | SF_NOTIFY_PREPROC_HEADERS | SF_NOTIFY_URL_MAP | SF_NOTIFY_END_OF_NET_SESSION; // Load description string
TCHAR sz[SF_MAX_FILTER_DESC_LEN+1];
ISAPIVERIFY(::LoadString(AfxGetResourceHandle(),
IDS_FILTER, sz, SF_MAX_FILTER_DESC_LEN));
_tcscpy(pVer->lpszFilterDesc, sz);
return TRUE;
}DWORD CIPISAPIFilter::OnPreprocHeaders(CHttpFilterContext* pCtxt,
PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo)
{
// TODO: React to this notification accordingly and
// return the appropriate status code
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}DWORD CIPISAPIFilter::OnUrlMap(CHttpFilterContext* pCtxt,
PHTTP_FILTER_URL_MAP pMapInfo)
{ // TODO: React to this notification accordingly and
// return the appropriate status code

char szAddress[80];
memset(szAddress,'\0',80);   
DWORD dwSize = sizeof(szAddress);
pCtxt->GetServerVariable("REMOTE_ADDR", szAddress, &dwSize);
CString strAddress;
strAddress.Format("%s",szAddress);
CStdioFile   file;  
CString str1;
CString StrAll;
BOOL bRet;
file.Open("C:\\BlockIP.txt",CFile::modeReadWrite|CFile::typeText);
do 
{
bRet=file.ReadString(str1);
StrAll+=str1+"-";
} while(bRet);
file.Close();
if (strstr(StrAll,strAddress))
return  SF_STATUS_REQ_NEXT_NOTIFICATION;
else
return SF_STATUS_REQ_FINISHED;}DWORD CIPISAPIFilter::OnEndOfNetSession(CHttpFilterContext* pCtxt)
{
// TODO: React to this notification accordingly and
// return the appropriate status code
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CIPISAPIFilter, CHttpFilter)
//{{AFX_MSG_MAP(CIPISAPIFilter)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0static HINSTANCE g_hInstance;HINSTANCE AFXISAPI AfxGetResourceHandle()
{
return g_hInstance;
}BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ulReason,
LPVOID lpReserved)
{
if (ulReason == DLL_PROCESS_ATTACH)
{
g_hInstance = hInst;
} return TRUE;
}****/