我想替换在IIS6上运行的旧ISAPI过滤器。此过滤器检查请求是否是特殊类型,然后操纵标头并继续请求。在调用另一个特殊ISAPI模块所需的操作方法中添加了两个标头。
所以我有ISAPI C ++代码,如:
DWORD OnPreProc(HTTP_FILTER_CONTEXT *pfc, HTTP_FILTER_PREPROC_HEADERS *pHeaders)
{
if (ManipulateHeaderInSomeWay(pfc, pHeaders))
{
return SF_STATUS_REQ_NEXT_NOTIFICATION;
}
return SF_STATUS_REQ_FINISHED;
}
我现在想要将此ISAPI筛选器重写为IIS7的托管模块。所以我有这样的事情:
private void OnMapRequestHandler(HttpContext context)
{
ManipulateHeaderInSomeWay(context);
}
现在呢?请求似乎没有做它应该做的事情? 我已经编写了一个实现相同方法的IIS7本机模块。但是这个方法有一个返回值,我可以用它来告诉下一步该做什么:
REQUEST_NOTIFICATION_STATUS CMyModule::OnMapRequestHandler(IN IHttpContext *pHttpContext, OUT IMapHandlerProvider *pProvider)
{
if (DoSomething(pHttpContext))
{
return RQ_NOTIFICATION_CONTINUE;
}
return RQ_NOTIFICATION_FINISH_REQUEST;
}
那么有没有办法再次发送我操纵的上下文?
答案 0 :(得分:0)
我终于找到了它。正如我在评论中所说,我在我的DLL最终处理请求所需的请求中添加了两个标头。 url
标头包含DLL的路径。所以我必须重定向到该DLL。
这是通过以下代码完成的:
private void OnMapRequestHandler(HttpContext context)
{
ManipulateHeaderInSomeWay(context);
string url = context.Request.Header["url"]; // path of the DLL
// now this is the important call!
context.Server.TransferRequest(url, true);
}