IIS Filter开发笔记

来源:互联网 发布:淘宝标题在线优化工具 编辑:程序博客网 时间:2024/06/15 17:07

注意:
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;
    }