代码之家  ›  专栏  ›  技术社区  ›  Simon Linder

如何操作标题,然后在c_中继续?

  •  0
  • Simon Linder  · 技术社区  · 16 年前


    我想替换一个在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 回复  |  直到 16 年前
        1
  •  0
  •   Simon Linder    16 年前

    我终于找到了。正如我在注释中所述,我向最终处理请求的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);
    }