Domanda


voglio sostituire un vecchio filtro ISAPI che riceve un IIS6. Questo filtro verifica se la richiesta è di un tipo speciale, quindi manipola l'intestazione e continua con la richiesta. Due intestazioni vengono aggiunte nel metodo manipolazione che ho bisogno di chiamare un altro modulo speciale ISAPI.
Così ho ISAPI C ++ codice come:

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;
}

Ora voglio riscrivere questo filtro ISAPI come un modulo gestito per l'IIS7. Così ho qualcosa di simile:

private void OnMapRequestHandler(HttpContext context)
{
    ManipulateHeaderInSomeWay(context);
}

E ora che cosa? La richiesta sembra non fare quello che dovrebbe?
ho già scritto un modulo nativo IIS7 che implementa lo stesso metodo. Ma questo metodo ha un valore di ritorno con cui posso dire cosa fare:

REQUEST_NOTIFICATION_STATUS CMyModule::OnMapRequestHandler(IN IHttpContext *pHttpContext, OUT IMapHandlerProvider *pProvider)
{
    if (DoSomething(pHttpContext))
    {
        return RQ_NOTIFICATION_CONTINUE;
    }
    return RQ_NOTIFICATION_FINISH_REQUEST;
}

Quindi non v'è un modo per inviare di nuovo il mio contesto manipolato?

È stato utile?

Soluzione

ho finalmente trovato. Come ho detto nei commenti aggiungo due intestazioni alla richiesta che sono necessari per il mio DLL che finalmente gestisce la richiesta. L'intestazione url contiene il percorso della DLL. Quindi devo fare un redirect a quella DLL.
Questo viene fatto con il seguente codice:

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top