请问如何开发isapi过滤器

bkm2 2007-03-15 03:26:35
实现获得请求页面对应的物理地址
...全文
376 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
chehw 2007-03-17
  • 打赏
  • 举报
回复
MSDN
Microsoft Platform SDK
bkm2 2007-03-17
  • 打赏
  • 举报
回复
那再请问一下,在vc中如何调用com组件?ISAPI的SDK哪有下?
chehw 2007-03-16
  • 打赏
  • 举报
回复
向导提供的是MFC的封装.
从性能方面考虑,ISAPI还是直接用SDK写比较好
bkm2 2007-03-16
  • 打赏
  • 举报
回复
为什么我按向导创建的isapi中没有HttpFilterProc函数??
chehw 2007-03-16
  • 打赏
  • 举报
回复
//我以前写的一个重定向filter,
//demo 版,有需要改进的地方。

DWORD WINAPI HttpFilterProc(PHTTP_FILTER_CONTEXT pfc, DWORD dwNotificationType, LPVOID pvNotification)
{

DWORD status = SF_STATUS_REQ_NEXT_NOTIFICATION;

static CHAR szRootPath[MAX_PATH];
static CHAR szRemapDir[MAX_PATH];

DWORD dwUrl;
DWORD i;
LPTSTR pCursor;
CHAR szSrvName[MAX_PATH];
DWORD dwSrvName;

CHAR szTemp[1024];
DWORD dwTemp;

switch ( dwNotificationType )
{
case SF_NOTIFY_PREPROC_HEADERS:
DWORD dwLimit;
pfc->pFilterContext = (VOID*)IgnoreNotification;
if(NULL==g_pIniData) return SF_STATUS_REQ_FINISHED;
szRootPath[0]='\0';
szRemapDir[0]='\0';

pfc->GetServerVariable(pfc, "LOCAL_ADDR", szTemp, &dwTemp);
if(lstrcmpi(szTemp, "10.10.10.10")==0)
{
dwLimit=65535;
}else
{
// WriteDebug("LOCAL_ADDR=%s\r\n", szTemp);
if(!CheckSerialNo(szTemp)) dwLimit=2;
}

szSrvName[0]=0;
dwSrvName=sizeof(szSrvName);
pfc->GetServerVariable(pfc, "SERVER_NAME", szSrvName, &dwSrvName);
// WriteDebug("SF_NOTIFY_PREPROC_HEADERS Start...\r\nSrvName=%s(license=%ld(\r\n", szSrvName, g_dwLicenses);

LPTSTR pszValue;



for(i=0;i<g_dwMappingsCount;i++)
{
if(i>=dwLimit)
{

break;
}
// WriteDebug("name=%s | value=%s\r\n", g_pIniData[i].pszName,g_pIniData[i].pszValue);


if(NULL==g_pIniData[i].pszName) return SF_STATUS_REQ_FINISHED;
if(StrCmpI(g_pIniData[i].pszName, szSrvName)==0)
{
pszValue=g_pIniData[i].pszValue;
if(NULL==pszValue) return SF_STATUS_REQ_FINISHED;
if(pszValue[0]=='\\' || pszValue[0]=='/')
{
pfc->pFilterContext = (VOID*)1;

wnsprintf(szRemapDir, sizeof(szRemapDir), "%s",pszValue);
// pszPath=(LPTSTR)LocalAlloc(LPTR, sizeof(TCHAR)*(lstrlen(szRemapDir)+1));
// lstrcpy(pszPath, szRemapDir);
break;
}else if(StrCmpNI(g_pIniData[i].pszValue, "http://", 7)==0)
{
pfc->pFilterContext = (VOID*)3;
TCHAR szResp[1024];
wnsprintf(szResp, sizeof(szResp),"Location: %s\r\n\r\n", g_pIniData[i].pszValue);

pfc->ServerSupportFunction(pfc, SF_REQ_SEND_RESPONSE_HEADER,
"302 Object Moved", (DWORD)szResp, 0);
pfc->ServerSupportFunction( pfc,
SF_REQ_DISABLE_NOTIFICATIONS,
NULL,
SF_NOTIFY_URL_MAP|
SF_NOTIFY_SEND_RAW_DATA |
SF_NOTIFY_END_OF_REQUEST,
0 );
// WriteDebug("redirect to %s\r\nSF_NOTIFY_PREPROC_HEADERS End\r\n", szResp);
return SF_STATUS_REQ_FINISHED;
}else
{
wsprintf(szRootPath, "%s", pszValue);
pfc->pFilterContext = (VOID*)2;
}
break;
}
}
// WriteDebug("SF_NOTIFY_PREPROC_HEADERS End\r\n");
// if(i==g_dwMappingsCount) return SF_STATUS_REQ_FINISHED;
break;
case SF_NOTIFY_URL_MAP:
HTTP_FILTER_URL_MAP *pUrlMap;
pUrlMap = (HTTP_FILTER_URL_MAP *)pvNotification;
szSrvName[0]=0;
dwSrvName=sizeof(szSrvName);
pfc->GetServerVariable(pfc, "SERVER_NAME", szSrvName, &dwSrvName);

pCursor=pUrlMap->pszPhysicalPath;
/* WriteDebug("\r\nBEGIN SF_NOTIFY_URL_MAP:\r\n"
"\tserver=%s\r\n"
"\tphypath=%s\r\n"
"\turl=%s\r\n"
"path-len=%ld\r\n",
// "root-path:%s\r\n",
szSrvName, pUrlMap->pszPhysicalPath, pUrlMap->pszURL, pUrlMap->cbPathBuff);
*/
if(pfc->pFilterContext != (VOID*)IgnoreNotification)
{
LPTSTR szUrl=(LPTSTR)pUrlMap->pszURL;
if(szRootPath[0]==0)
{
dwUrl=lstrlen(szUrl);
lstrcpyn(szRootPath, pUrlMap->pszPhysicalPath, lstrlen(pUrlMap->pszPhysicalPath)-dwUrl+1);
if(szRootPath[lstrlen(szRootPath)-1]=='\\') szRootPath[lstrlen(szRootPath)-1]='\0';

}
WriteDebug("root path=%s\r\n", szRootPath);
switch((DWORD)pfc->pFilterContext)
{
case 1:
pCursor+=wsprintf(pCursor, "%s%s", szRootPath, szRemapDir);
break;
case 2:
pCursor+=wsprintf(pCursor, "%s", szRootPath);
break;
case 3:
break;

}

dwUrl=lstrlen(szUrl);
// WriteDebug("Remapping from %s to \r\n", pUrlMap->pszPhysicalPath);


for(i=0;i<(DWORD)lstrlen(szUrl);i++)
{
if(szUrl[i]=='/') *pCursor='\\';
else *pCursor=szUrl[i];
pCursor++;
}
*pCursor='\0';
}
// WriteDebug("altered phypath=%s\r\nEND SF_NOTIFY_URL_MAP\r\n", pUrlMap->pszPhysicalPath);
// pfc->pFilterContext = (VOID*)IgnoreNotification;
break;
default:
break;
}



return SF_STATUS_REQ_NEXT_NOTIFICATION;
}
bkm2 2007-03-15
  • 打赏
  • 举报
回复
请问哪有源码可以下参考?我还想先根据物理路径名,进行判断,然后根据判断结果,将请求页面重定向,谢谢
chehw 2007-03-15
  • 打赏
  • 举报
回复
DWORD WINAPI HttpFilterProc(PHTTP_FILTER_CONTEXT pfc,DWORD notificationType,LPVOID pvNotification)
{
switch(notificationType)
{
case SF_NOTIFY_URL_MAP:
HTTP_FILTER_URL_MAP *pUrlMap;
pUrlMap=(HTTP_FILTER_URL_MAP *)pvNotification;
//输出pUrlMap->pszPhysicalPath

...

}
菜牛 2007-03-15
  • 打赏
  • 举报
回复
宽泛的问题只能宽泛回答:
MSDN中有

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧