这样做显然要增加站点的维护工作,更新主页时要同时更新两部分。而且如果主页内容是实时更新的,采用手工维护两套主页的方法显然不行了。本文介绍了用ISAPI过滤器来动态产生另外一套内码主页的方法,这样就可以只制作一套主页就同时支持GB码和 BIG5码。
基本的思路,编写一个ISAPI过滤器,对于所有最终返回给用户的HTML文本,实行内码转换。这样用户看到的将是他期望的编码方式。ISAPI过滤器可以作为WEBServer横向功能扩展。当某个预先定义好
的服务器端的事件发生时,IIS就调用用户定义好的过程,此时就可以通过修改IIS传来的数据来改变IIS的行为。IIS预定义的事件如下:
SF_NOTIFY_READ_RAW_DATA
当IIS要从用户读入数据时发生。过滤器可以在IIS处理他们之前检查甚至修改用户输入的原始数据。
SF_NOTIFY_PREPROC_HEADERS
IIS预处理HTTP请求包头后发生。过滤器可以检查修改增加包头。
SF_NOTIFY_AUTHENTICATION
IIS试图验证用户身份时发生。过滤器可以实现自己的验证方案。
SF_NOTIFY_URL_MAP
IIS试图将URL解释为物理文件时。过滤器可以将请求重定向到其他的文件。
SF_NOTIFY_ACCESS_DENIED
当身份验证失败时发生。
SF_NOTIFY_SEND_RAW_DATA
当其他程序处理完,IIS准备将数据发回给用户时发生。我们的过滤器就通过此事件,转换内码。
SF_NOTIFY_LOG
当IIS写记录到LOG文件时。过滤器可以搜集更多的信息写入记录文件中。
SF_NOTIFY_END_OF_REQUEST
当一个HTTP请求结束时发生。过滤器可以实现基于请求的处理。由于这是在IIS3.0中新增的,Delphi中的ISAPI2.pass单元中没有相应的定义可以手工加入SF_NOTIFY_END_OF_REQUEST=$80
SF_NOTIFY_END_OF_NET_SESSION
连接结束时。注意如果浏览器支持"keep-alive",一次连接可能包含几个HTTP请求。过滤器可以用他来释放一些用户的资源。
我们要实现动态的内码转换,只要过滤器处理SF_NOTIFY_SEND_RAW_DATA事件,将IIS处理好的数据转换成需要的内码就可以实现内码的动态转换。具体程序有两个问题需要注意:
1.过滤器只能处理返回是HTML格式的,其他图片等二进制请求无须也不允许转换。
2.对于返回的HTML,只处理实际数据,其他HTTP协议的包不应该处理。