IIS Filter开发笔记

注意:
1. 需要在GetFilterVersion中手工添加你所感兴趣的事件,事件发生时IIS才会通知filter,然后你才能在相关的事件处理函数中进行操作
pVer->dwFlags |= SF_NOTIFY_SECURE_PORT | SF_NOTIFY_NONSECURE_PORT | SF_NOTIFY_PREPROC_HEADERS;

2. GetHeader和SetHeader时注意部分头是需要冒号
 char *pHeader = new char[BUF_SIZE + 1];
  std::auto_ptr<char> pcHeader(pHeader);
DWORD dwBufSize = BUF_SIZE;
 pcHeader[0]=0;
 pHeaders->GetHeader(pfc->m_pFC, “User-Agent:”, pcHeader, &dwBufSize);
pHeaders->SetHeader(pfc->m_pFC, "Accept-Encoding:", "gzip");

头“URL”是没有冒号的

3.设置COOKIE

pFC->AddResponseHeaders(pFC, "Set-Cookie: Cookie1=Value1; path=/;/r/n",0);
(持久COOKIE):
pFC->AddResponseHeaders(pFC,"Set-Cookie: Cookie1=Value1;
   expires=Fri 22-May-1998 13:00:00 GMT; path=/;/r/n", 0);
4.获取URL

std::auto_ptr<char> pcHeaderWrap(pcHeader);

            pHeaders->GetHeader(pfc->m_pFC, "URL", pcHeader, &dwBufSize);
            CString url = pcHeader;
            url.Trim().MakeLower();
            if (url.Find(m_restartUrl) == 0)
            {   

直接返回:


DWORD CfilterEntryManager::FilterHeader(CHttpFilterContext
*  pfc, PHTTP_FILTER_PREPROC_HEADERS pHeaders)
{
.....
.....

static char* s_szStatus = "HTTP/1.1 200 OK";
     
static char* s_szContent = "Content-Type: text/html";
     
static char* s_szContentSplit = " ";

     DWORD dwInfoSize 
= strlen(s_szStatus);
     pfc
->ServerSupportFunction(SF_REQ_SEND_RESPONSE_HEADER, s_szStatus, &dwInfoSize, NULL);     
     dwInfoSize 
= strlen(s_szContent);
     pfc
->ServerSupportFunction(SF_REQ_SEND_RESPONSE_HEADER, s_szContent, &dwInfoSize, NULL);


     dwInfoSize 
= strlen(s_szContentSplit);
     pfc
->WriteClient(s_szContentSplit, &dwInfoSize);
     dwInfoSize 
= logInfo.length();     
     pfc
->WriteClient(const_cast<char*>(logInfo.c_str()), &dwInfoSize);

    
    
return SF_STATUS_REQ_FINISHED;

}


//增加后续操作:

DWORD CFilterHeaderFilter::OnPreprocHeaders(CHttpFilterContext *  pfc, PHTTP_FILTER_PREPROC_HEADERS pHeaders)
{
    
// TODO: Add your specialized code here and/or call the base class
    DWORD res = CfilterEntryManager::Instance().FilterHeader(pfc, pHeaders);
    
if (res != SF_STATUS_REQ_NEXT_NOTIFICATION)
    
{
        
return res;
    }

        
//如果状态没有改变,继续流入下一个fiter
    return CHttpFilter::OnPreprocHeaders(pfc, pHeaders);
}

 


遗留问题:

log4cpp在Fiter中无法正常工作!相同的代码编译成LIB,放到测试类中可以工作,但是放到FILTER中,在初始化appender时,总是在获取lock直接退出当前堆栈,连异常都没有
void Appender::_addAppender(Appender* appender) {
        threading::ScopedLock lock(_appenderMapMutex);// 进入临界区失败EnterCriticalSection(_criticalSection);
        _getAllAppenders()[appender->getName()] = appender;
    }

------------------------------------------------
根据断点跟踪发现,Appender的静态变量_appenderMapMutex在被使用时其构造函数竟然没有调用??
(给其增加成员,并在构造函数中初始化成员,结果那些测试的成员并没有初始化);后来增加了自定义的静态成员也没有初始化?
同时,在filter模块中的一切静态成员工作正常。SO 迷了!!!!

相关代码如下,一切正常:
定义  static threading::Mutex _appenderMapMutex; //Appender.hh
初始化和使用//Appender.cpp
namespace log4cpp {
    threading::Mutex Appender::_appenderMapMutex;  //初始化
 
void Appender::_addAppender(Appender* appender) {
        threading::ScopedLock lock(_appenderMapMutex);
        _getAllAppenders()[appender->getName()] = appender;
    }
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IIS自动绑定子目录过滤器,Delphi开发的DLL源码,关于本类库:免费开源,欢迎采用软件及源码部分片段,注意上图中红色部分,该源码编译完成后为DLL文件,无界面。 V0.1、首次进行内部测试,使用ini文件进行子目录映射,程序认wwwroot目录 V0.2、为“阿男”添加自动子目录逻辑映射功能 V0.3、增加配置文件读取延时功能(读取配置文件从API变到了Stream),不再要求配置文件中必须包含[common]一项 V0.4、增加泛域名支持 V0.5、增加自动映射子目录功能,增加遍历泛域名支持 V0.6、增加全局配置文件,在动态库相同目录,和动态库同名,扩展名为.ini RefreshInterval 读取虚拟主机映射配置文件的时间间隔,单位:分,允许小数 UseAbsoulateMapFile 是否为之际映射文件制定绝对地址,0:否(缺省),1:是 MapFileName 映射文件相对虚拟主机根目录的位置,包含文件名。 VirtualRootType 虚拟主机的查找方式,0:按照VirtualRootName名称(缺省),1:按照VirtualRootDepth目录深度 VirtualRootName 虚拟主机根目录的名称 VirtualRootDepth 虚拟主机根目录的深度 V0.6.2、增强泛解析功能,支持*.ebugs.org=ebugs/*之类的解析 V0.6.3、增强泛解析功能,支持*.ebugs.org=ebugs/?之类的解析 V1.0、发布V1.0版本,增加宏定义,同时发布调试版和正式版两个版本 增加刷新间隔为负数的控制,如果为负数,则只是在启动时读取一次,平时不刷新。 V1.1、增加FastMM的引用,以替代BorlandMM解决内存问题 V1.2、去掉所有限制,开放源代码,免费使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值