如何操作标题然后在C#中继续它?

时间:2010-03-19 13:09:16

标签: c# c++ iis-7 isapi ihttpmodule


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

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

1 个答案:

答案 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);
}