0


IIS6 で実行されていた古い ISAPI フィルターを置き換えたいと考えています。このフィルターは、リクエストが特別な種類のものかどうかをチェックし、ヘッダーを操作してリクエストを続行します。別の特別な ISAPI モジュールを呼び出すために必要な操作メソッドに 2 つのヘッダーが追加されます。
したがって、次のような 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 が必要とする 2 つのヘッダーをリクエストに追加します。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 に答える