求C#写ISAPI Filter的教程

Eri 2005-04-04 01:26:56
在MSDN上面找到C++的例子,C#应该也能写吧。

/*
Copyright (c) Microsoft Corporation
Module Name: upcase.c
*/

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <httpfilt.h>

BOOL WINAPI __stdcall GetFilterVersion(HTTP_FILTER_VERSION *pVer)
{
/* Specify the types and order of notification */

pVer->dwFlags = (SF_NOTIFY_NONSECURE_PORT | SF_NOTIFY_URL_MAP | SF_NOTIFY_SEND_RAW_DATA | SF_NOTIFY_ORDER_DEFAULT);

pVer->dwFilterVersion = HTTP_FILTER_REVISION;

strcpy(pVer->lpszFilterDesc, "Upper case conversion filter, Version 1.0");

return TRUE;
}

DWORD WINAPI __stdcall HttpFilterProc(HTTP_FILTER_CONTEXT *pfc, DWORD NotificationType, VOID *pvData)
{
CHAR *pchIn, *pPhysPath;
DWORD cbBuffer, cbtemp;
PHTTP_FILTER_URL_MAP pURLMap;
PHTTP_FILTER_RAW_DATA pRawData;

switch (NotificationType) {

case SF_NOTIFY_URL_MAP :

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

pURLMap = (PHTTP_FILTER_URL_MAP)pvData;

pPhysPath = pURLMap->pszPhysicalPath;

pfc->pFilterContext = 0;

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

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

for ( ; *(pPhysPath + 3) ; pPhysPath++)
*pPhysPath = *(pPhysPath + 3);

/* NULL terminate the string */

*pPhysPath = '\0';

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

pfc->pFilterContext = (VOID *)1;

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

break;
}
}
}

break;

case SF_NOTIFY_SEND_RAW_DATA :

if (pfc->pFilterContext)
{
pRawData = (PHTTP_FILTER_RAW_DATA)pvData;

pchIn = (BYTE *)pRawData->pvInData;

cbBuffer = 0;

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

for ( ; cbBuffer < pRawData->cbInData - 2; cbBuffer++)
{
if (pchIn[cbBuffer] == '\n' && pchIn[cbBuffer + 2] == '\n')
{
cbBuffer += 3;

break;
}

cbBuffer++;
}

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

break;
}
}

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

/* Now uppercase everything */

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

break;

default :

break;
}

return SF_STATUS_REQ_NEXT_NOTIFICATION;
}
...全文
209 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eri 2005-06-06
  • 打赏
  • 举报
回复
这么久都没有高手来?
Eri 2005-04-09
  • 打赏
  • 举报
回复
高手走了?
Eri 2005-04-05
  • 打赏
  • 举报
回复
自定义Log,就是不用IIS的Log纪录功能,
自己写一个ISAPI Filter自定义实现Log纪录,在IIS6上面。
C#应该能写吧?
saucer 2005-04-04
  • 打赏
  • 举报
回复
>>>来自定义IIS的Log


什么意思?写自定义的Log?HttpModules只对ASP.NET管用

http://msdn.microsoft.com/msdnmag/issues/02/08/HTTPFilters/
Eri 2005-04-04
  • 打赏
  • 举报
回复
我想明白的一个就是,我想用C#写一个ISAPI,
来自定义IIS的Log
HttpModules能做到么?
saucer 2005-04-04
  • 打赏
  • 举报
回复
if you mean for ASP.NET, you should be writing HttpModules, see

How To Create an ASP.NET HTTP Module Using Visual C# .NET
http://support.microsoft.com/kb/307996/EN-US/

Implementing an IIS Application Filter Using .NET HttpModules and Response Filtering
http://www.devx.com/vb2themax/Article/19901/0/page/1

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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