我们使用IIS 6提供静态内容并路由到另一台服务器上动态生成的页面。现在我们想添加一些可以在整个请求中遵循的日志记录,因此对于我们想要的每个请求:
我可以使用某种类型的脚本吗?或者我是否需要构建某种类型的插件? (我不知道我有什么选择,从哪里开始。)
答案 0 :(得分:0)
我找到的唯一方法是在C中创建一个ISAPI过滤器。我没有完成,但到目前为止,我已设法将此过滤器加载到IIS中(使用MSVC2010 Express + Win7.1 SDK编译):
#include <windows.h>
#include <httpfilt.h>
#include <stdio.h>
#pragma warning(disable:4996)
BOOL WINAPI GetFilterVersion(PHTTP_FILTER_VERSION pVer)
{
const char* desc = "Some filter, version 0.1";
pVer->dwFilterVersion = HTTP_FILTER_REVISION;
pVer->dwFlags = SF_NOTIFY_PREPROC_HEADERS | SF_NOTIFY_ORDER_HIGH;
strncpy(pVer->lpszFilterDesc, desc, SF_MAX_FILTER_DESC_LEN);
return TRUE;
}
DWORD WINAPI HttpFilterProc(PHTTP_FILTER_CONTEXT pfc, DWORD NotificationType, LPVOID pvNotification)
{
char uuid[50];
if (NotificationType == SF_NOTIFY_PREPROC_HEADERS)
{
PHTTP_FILTER_PREPROC_HEADERS lHeaders = (PHTTP_FILTER_PREPROC_HEADERS)pvNotification;
GUID guid;
CoCreateGuid(&guid);
_snprintf(uuid, sizeof(uuid), "{%08X-%04hX-%04hX-%02X%02X-%02X%02X%02X%02X%02X%02X}", guid.Data1, guid.Data2, guid.Data3, guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
// ToDo: print the UUID in the log as well.
lHeaders->AddHeader(pfc, "Log-Request-ID:", uuid);
}
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}
并将它们导出到.def文件中:
LIBRARY "log_request_filter"
EXPORTS
GetFilterVersion
HttpFilterProc
DLL现在在IIS6中加载。仍然要获取日志行(或修改某些lower-prio过滤器中的重定向日志行)并使标头正常工作。