ISAPI可以完成很多功能,asp.net的实现底层也是通过isapi来解析asp.net的代码的。
通过开发isapi,然后在iis中配置后可以解析不同的文件。
比如java,perl的代码也可以通过加载isapi的方式在iis中进行访问
ISAPI两种开发方式:扩展(如:aspnet_isapi.dll)和过滤(如:aspnet_filter.dll)
过滤可以实现许多功能,比如将简体转成繁体,大小写转换等, 参见UpCase
引用:
在 Microsoft Visual Studio 2005, 中创建新项目时在 新建项目 对话框中没有找到 VisualC++ 下 MFC ISAPI Extension DLL 模板。
因为 Microsoft 已删除 MFC ISAPI Extension DLL 模板为 Visual Studio 2005 发生此行为。
用于新 ISAPI 筛选或扩展开发, 我们建议您使用 MicrosoftInternet 信息服务 (IIS) 软件开发工具包 (SDK) 中 ISAPI 入口 - Point 函数代替 MFC ISAPI 类。 Microsoft Windows Server 2003 Service Pack 1 (SP 1) 平台 SDK 包括许多 ISAPI 示例。 请以获取 PlatformSDK, 访问以下 MicrosoftWeb 站点:
http://www.microsoft.com/downloads/details.aspx?FamilyID=eba0128f-a770-45f1-86f3-7ab010b398a3&DisplayLang=en (http://www.microsoft.com/downloads/details.aspx?FamilyID=eba0128f-a770-45f1-86f3-7ab010b398a3&DisplayLang=en)
注意 时间少, 必须安装 Microsoft Windows 核心 SDK 和 IIS SDK。
默认情况下, 从 SDK ISAPI 示例位于以下文件夹:
程序 Files\Microsoft 平台 SDK\Samples\Web\iis
有关如何创建 ISAPI 筛选器和扩展, 请访问以下 Microsoft Developer Network (MSDN) 网站:
最主要的代码如下:
DWORD WINAPI __stdcall HttpFilterProc(HTTP_FILTER_CONTEXT
*
pfc, DWORD NotificationType, VOID
*
pvData)2
{3
CHAR *pchIn, *pPhysPath;4
DWORD cbBuffer, cbtemp;5
PHTTP_FILTER_URL_MAP pURLMap;6
PHTTP_FILTER_RAW_DATA pRawData;7

8
switch (NotificationType) {9

10
case SF_NOTIFY_URL_MAP :11

12
/* Check the URL for a subdirectory in the form of /UC/ or /uc/ */13

14
pURLMap = (PHTTP_FILTER_URL_MAP)pvData;15

16
pPhysPath = pURLMap->pszPhysicalPath;17

18
pfc->pFilterContext = 0;19

20
for ( ; *pPhysPath; pPhysPath++) 21
{22
/* Ensure that there are at least 4 characters (checking for "\UC\") left in the URL before checking */23

24
if (strlen(pPhysPath) > 3) 25
{26
if (*pPhysPath == '\\' && (*(pPhysPath + 1) == 'u' || *(pPhysPath + 1) == 'U') && (*(pPhysPath + 2) == 'c' || *(pPhysPath + 2) == 'C') && *(pPhysPath + 3) == '\\')27
{28
/* Now that we've found it, remove it by collapsing everything down */29

30
for ( ; *(pPhysPath + 3) ; pPhysPath++)31
*pPhysPath = *(pPhysPath + 3);32

33
/* NULL terminate the string */34

35
*pPhysPath = '\0'; 36

37
/* And set the flag to let the SF_NOTIFY_SEND_RAW_DATA handler know to uppercase the content */38

39
pfc->pFilterContext = (VOID *)1;40

41
/* Break us out of the loop - note that this will only find the first instance of /UC/ in the URL */42

43
break;44
}45
}46
}47

48
break;49

50
case SF_NOTIFY_SEND_RAW_DATA :51

52
if (pfc->pFilterContext)53
{54
pRawData = (PHTTP_FILTER_RAW_DATA)pvData;55

56
pchIn = (BYTE *)pRawData->pvInData;57

58
cbBuffer = 0;59

60
if (pfc->pFilterContext == (VOID *)1)61
{62
/* 63
As this is the first block, scan through it until 2 CRLFs are seen, to pass64
all of the headers.65
*/66

67
for ( ; cbBuffer < pRawData->cbInData - 2; cbBuffer++)68
{69
if (pchIn[cbBuffer] == '\n' && pchIn[cbBuffer + 2] == '\n')70
{71
cbBuffer += 3;72

73
break;74
}75

76
cbBuffer++;77
}78

79
for (cbtemp = 0; cbtemp < (cbBuffer - 3); cbtemp++) 80
{81
if (pchIn[cbtemp] == '/' && pchIn[cbtemp + 1] == 'h' && pchIn[cbtemp + 2] == 't' && pchIn[cbtemp + 3] == 'm')82
{83
pfc->pFilterContext = (VOID *)2;84

85
break;86
}87
}88

89
if (cbtemp == cbBuffer)90
pfc->pFilterContext = 0; /* not an html file */91
}92

93
/* Now uppercase everything */94

95
if (pfc->pFilterContext)96
for ( ; cbBuffer < pRawData->cbInData; cbBuffer++)97
pchIn[cbBuffer] = (pchIn[cbBuffer] >= 'a' && pchIn[cbBuffer] <= 'z') ? (pchIn[cbBuffer] - 'a' + 'A') : pchIn[cbBuffer];98
}99

100
break;101

102
default :103

104
break; 105
}106
107
return SF_STATUS_REQ_NEXT_NOTIFICATION;108
}