RT

解决方案 »

  1.   

    http://bbs.ustc.edu.cn/cgi-bin/bbstcon?board=DataBase&file=M.841920224.A
      

  2.   

    使用ISAPI Extension 通配符映射。HSE_EXEC_URL_INFO ExecUrlInfo={0};
    if(lstrcmpi(pecb->lpszMethod, "POST")==0)
    {
        LPHSE_EXEC_URL_ENTITY_INFO pEntityInfo=NULL;
        FilterPostData(pecb, &pEntityInfo);
        ExecUrlInfo.pEntity=pEntityInfo;
    }pecb->ServerSupportFunction(pecb->ConnID, HSE_REQ_EXEC_URL, &ExecUrlInfo, ...);
      

  3.   

    使用ISAPI Extension 通配符映射。应该怎么加啊?
    \
      

  4.   

    IIS 信息服务管理器 
    “主目录” - “配置” -“通配符应用程序映射(执行次序)” - “添加”
      

  5.   

    建ISAPI工程的时候选择生成服务器扩展对象就会有CXXExtension了。
    然后在 HttpExtensionProc 回调函数里添加 //检查POST数据
    if( ( _stricmp(pECB->lpszMethod,"post") == 0 )  && 
    CConfig::GetInstance().m_bDebugCheckPost
    )
    {
    DWORD dwReturn =  CheckPostData(pECB,pUrl);//处理POST数据包
    if( dwReturn > 0 )
    {
    if ( pUrl )
    {
    LocalFree( pUrl );
    pUrl = NULL;
    }
    return dwReturn;
    } }
      

  6.   

    而且我是在过滤器里想获取客户端POST过来的数据,不是在扩展里
      

  7.   

    我看了MSDN的文档,说IIS5.1和IIS6.0好像不支持OnReadRawData方法了,所以没办法获取客户端传过来的原始数据,所以在Filter里,我不知道怎么样获取客户端传过来的原始数据,还请各位高手给指点一下,若能解决,马上给分
      

  8.   

    HttpFilterProc中处理SF_NOTIFY_READ_RAW_DATAFilter的作用范围是整个网站,对性能有影响。如果是Web Server用的是IIS6.0,可以在指定虚拟目录下借助ISAPI Extension的通配符映射来实现此类功能。
      

  9.   

    谁能仔细讲一下怎么实现啊,我加上了通配符了,也走进去了,问题是我想处理完POST数据后,让它继续往下走啊,进了Default后打印几行字就停在那里了,这样不符合逻辑啊
      

  10.   

    示例:
    LPCTSTR DEFAULT_HEADER=TEXT("Content-Type:text/html\r\n\r\n");
    LPCTSTR DEFAULT_STATUS=TEXT("200 OK");VOID WINAPI HseIoCompletionProc(EXTENSION_CONTROL_BLOCK *pecb, LPVOID lpContext, DWORD cbIO, DWORD cbError);
    BOOL SendResponseHeaders(EXTENSION_CONTROL_BLOCK *pecb, LPCTSTR lpszStatus, LPCTSTR lpszHeader, BOOL fKeepConn=FALSE);
    BOOL ProcessPostData(LPHSE_EXEC_URL_ENTITY_INFO *ppEntityInfo);const CHAR szPostData[]="postcontent=test&username=aa&userpass=md5hash";BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO *pVer)
    {
    lstrcpy(pVer->lpszExtensionDesc, "ExecUrl Test Sample");
    pVer->dwExtensionVersion=MAKELONG(HSE_VERSION_MINOR, HSE_VERSION_MAJOR);
    return TRUE;
    }DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pecb)
    {
    DWORD dwStatus=HSE_STATUS_ERROR;
    BOOL rc;
    HSE_EXEC_URL_INFO ExecUrlInfo={0};
    HSE_EXEC_URL_ENTITY_INFO *pEntity=NULL; rc=ProcessPostData(&pEntity);
    ExecUrlInfo.pEntity = pEntity;
    ExecUrlInfo.dwExecUrlFlags = HSE_EXEC_URL_IGNORE_CURRENT_INTERCEPTOR; rc=pecb->ServerSupportFunction(pecb->ConnID, HSE_REQ_IO_COMPLETION, HseIoCompletionProc, NULL, (LPDWORD)pEntity);
    if(!rc) goto Failed;

    rc=pecb->ServerSupportFunction(pecb->ConnID, HSE_REQ_EXEC_URL, &ExecUrlInfo, NULL, NULL);
    if(!rc) goto Failed;
    return HSE_STATUS_PENDING;
    Failed:
    if(dwStatus!=HSE_STATUS_PENDING) 
    {
    if(NULL!=pEntity) 
    {
    LocalFree(pEntity);
    pEntity=NULL;
    }
    }// SendResponseHeaders(pecb, NULL, "Content-Type:text/html\r\n\r\nHello World2!", FALSE);
    OutputDebugString("ExecUrl Error!");
    return dwStatus;
    }BOOL WINAPI TerminateExtension(DWORD dwFlags)
    {
    return TRUE;
    }
    BOOL ProcessPostData(LPHSE_EXEC_URL_ENTITY_INFO *ppEntityInfo)
    {

    if(NULL==ppEntityInfo) return FALSE;
    *ppEntityInfo=(LPHSE_EXEC_URL_ENTITY_INFO)LocalAlloc(LPTR, sizeof(HSE_EXEC_URL_ENTITY_INFO));
    if(NULL==*ppEntityInfo) return FALSE;
    (*ppEntityInfo)->lpbData=(LPVOID)szPostData;
    (*ppEntityInfo)->cbAvailable=sizeof(szPostData)-1;
    return TRUE;
    }BOOL SendResponseHeaders(EXTENSION_CONTROL_BLOCK *pecb, LPCTSTR lpszStatus, LPCTSTR lpszHeader, BOOL fKeepConn)
    {
    HSE_SEND_HEADER_EX_INFO HeaderEx;
    if(NULL==lpszStatus) lpszStatus=DEFAULT_STATUS;
    if(NULL==lpszHeader) lpszHeader=DEFAULT_HEADER;
    HeaderEx.pszHeader=lpszHeader;
    HeaderEx.pszStatus=lpszStatus;
    HeaderEx.cchHeader=lstrlen(lpszHeader);
    HeaderEx.cchStatus=lstrlen(lpszStatus);
    HeaderEx.fKeepConn=fKeepConn;
    return pecb->ServerSupportFunction(pecb->ConnID, HSE_REQ_SEND_RESPONSE_HEADER_EX, &HeaderEx, NULL, NULL);}VOID WINAPI HseIoCompletionProc(EXTENSION_CONTROL_BLOCK *pecb, LPVOID lpContext, DWORD cbIO, DWORD cbError)
    {
    HSE_EXEC_URL_STATUS ExecUrlStatus={0};
    BOOL rc;
    LPHSE_EXEC_URL_ENTITY_INFO pEntity=(LPHSE_EXEC_URL_ENTITY_INFO)lpContext;
    rc=pecb->ServerSupportFunction(pecb->ConnID, HSE_REQ_GET_EXEC_URL_STATUS, &ExecUrlStatus, NULL, NULL);
    if(rc)
    {
    // log status
    }
    if(NULL!=pEntity)
    {
    LocalFree(pEntity);
    }
    pecb->ServerSupportFunction(pecb->ConnID, HSE_REQ_DONE_WITH_SESSION, NULL, NULL, NULL);
    }
      

  11.   

    唉,不行啊,一进HttpExtensionProc函数就出错,谁有现成的,能过滤POST提交方式的例子?能给一个吗?
      

  12.   

    ISAPI只能是这样,处理完POST数据就结束,它本身根本没有继续处理的机制.
      

  13.   

    代码我测试过了,应该没问题。别用MFC的extension dll, 直接建一个win32 dll工程(SDK),手工写.def文件。
      

  14.   

    在ProcessPostData中加入相应的过滤处理就可以了。示例代码中是将所有post的数据替换为szPostData的内用。实际应用中先读取所有的post数据至一缓冲区,
    令pEntity->lpbData=MyBuffer;
    pEntity->cbAvailable=cbBuffer;
    再设一下pecb->cbTotayBytes=pEntity->cbAvailable就可以了。
      

  15.   

    通常在 
    OnPreprocHeaders(CHttpFilterContext* pfc, PHTTP_FILTER_PREPROC_HEADERS pHeaders)
    事件中响应:
    char szMethod[32]={0};
    DWORD cbUrl = sizeof(szMethod);
    pHeaders->GetHeader(pfc->m_pFC, "method",szMethod,&cbMethod);
    ...
      

  16.   

    通常在 
    OnPreprocHeaders(CHttpFilterContext* pfc, PHTTP_FILTER_PREPROC_HEADERS pHeaders) 
    事件中响应: 
    char szMethod[32]={0}; 
    DWORD cbMethod = sizeof(szMethod); 
    pHeaders->GetHeader(pfc->m_pFC, "method",szMethod,&cbMethod); 
    ...
      

  17.   

    chehw老兄,我是用MFC直接建的,所以你上次说的方法我一用就报错啊
    ok1234567老兄,你能在OnPreprocHeaders方法里获取到客户端提交的POST数据吗?你上面的只能获得POST请求的类型吧?你能不能详细实现一下?