<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      使用ISAPI過濾器增強IIS的技巧

      [摘要]作為一個WWW服務器軟件,微軟公司的Internet Infomation Server(IIS)簡單易學,管理方便,得到了廣泛的使用。您還可以通過ISAPI過濾器,進行自己定制的處理,來增強IIS...

      作為一個WWW服務器軟件,微軟公司的Internet Infomation Server(IIS)簡單易學,管理方便,得到了廣泛的使用。您還可以通過ISAPI過濾器,進行自己定制的處理,來增強IIS的功能。ISAPI過濾器可以定制以下的處理:接收HTTP協議頭預處理、發送HTTP協議頭預處理、發送生數據預處理、獲得生數據預處理、HTTP會話結束信息處理、自定義的安全認證機制、URL映射信息處理、日志記錄處理等。靈活利用這些定制處理,您可以完成許多看似難以實現的功能,得到意想不到的效果。但是ISAPI過濾器使用不當也會影響服務器的性能。


      ISAPI過濾器的開發非常簡單,只需要完成三個接口DLL函數即可。它們是GetFilterVersion()、HttpFilterProc()、TerminateFilter(),大家可以查看MSDN了解詳細的用法。ISAPI過濾器是DLL文件,一般用C/C++語言開發。為使ISAPI過濾器能夠運行,您需要在注冊表的HKEY_LOCAL_MACHINE\System\CurrentControlSet\
      Services\W3SVC\Parameters下建立一個字符串項,其名稱為"Filter Dlls",值為ISAPI過濾器文件的全路徑名稱。若這個字符串項已經存在,只需把它的全路徑名稱加入其中,不同的ISAPI過濾器文件之間用";"分隔,您可以根據執行的優先順序加在適當的位置。設置好后重新啟動IIS服務,您的ISAPI過濾器就發揮作用了。

      下面作者舉一個具體的應用例子。

      對訪問內容進行統計分析:
      通常我們在需要計數的頁面內放一個計數器,或者使用ASP文件來實現計數功能。這種方法不能適用于如README.TXT等其他非HTML格式的文件。如果使用IIS的日志功能又太占用空間而不方便。作者通過定制URL映射信息處理來跟蹤感興趣的幾個文件的計數統計,將結果記錄在一個文件中。

      下面是它的源程序。

      fcount.def:
      LIBRARY fcount
      EXPORTS GetFilterVersion
       HttpFilterProc
       TerminateFilter

      fcount.c:
      #include <stdio.h>
      #include <string.h>
      #include <windows.h>
      #include <httpfilt.h>

      #define logfile "C:\\InetPub\\fcount.log"
      #define pages 5
      char* urls[] = {
        "/default.htm",
        "/banner.gif",
        "/product/readme.txt",
        "/product/product1.htm",
        "/product/product2.htm"
        };
      int counts[pages];

      BOOL WINAPI GetFilterVersion
      (HTTP_FILTER_VERSION *pVer)
      {
      int i;

       pVer->dwFilterVersion = HTTP_FILTER_REVISION;
      strcpy(pVer->lpszFilterDesc, "fcount");
       pVer->dwFlags = SF_NOTIFY_URL_MAP; /* 過濾的內容 */

       for (i=0; i<pages; i++) { /* 從文件讀入初始計數值 */
      counts[i] = GetPrivateProfileInt("VisitCounter",
      urls[i],
      0, logfile);
      }

       return TRUE;
      }

      DWORD WINAPI HttpFilterProc
      (HTTP_FILTER_CONTEXT *pfc,
       DWORD noteType, VOID *pvNote)
      {
       int i;
       char lurl[512];
       char buf[16];

       strcpy(lurl, ((PHTTP_FILTER_URL_MAP)pvNote)
      ->pszURL);
       _strlwr(lurl);
       for (i=0; i<pages; i++) {
       if (strcmp(lurl, urls[i])==0) {
        counts[i] ++; /* 計數值增加 */
        if (counts[i]%10==0) {
      /* 當計數值滿10時記入文件,
       以免系統突然死掉時數據全部丟失 */
        _itoa(counts[i], buf, 10);
        WritePrivateProfileString("VisitCounter",
       urls[i], buf, logfile);
        }
        break;
       }
       }
       return SF_STATUS_REQ_NEXT_NOTIFICATION;
      }

      BOOL WINAPI TerminateFilter(DWORD dwFlags)
      {
       int i;
       char buf[16];

       for (i=0; i<pages; i++) {
          /* 系統停止時將計數值寫入文件 */
       _itoa(counts[i], buf, 10);
       WritePrivateProfileString("VisitCounter",
       urls[i], buf, logfile);
       }
       return TRUE;
      }

      以上二個例子作者使用VC 6.0編譯,在WINNT2000 + SP3 和 IIS 5.0上調試通過。




      日韩精品一区二区三区高清