0


我想替换在 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;
}

那么有没有办法再次发送我操纵的上下文?

4

1 回答 1

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);
}
于 2010-03-22T14:10:43.247 回答