Pregunta


quiero reemplazar un filtro ISAPI de edad que se ejecutaba en IIS6. Este filtro comprueba si la solicitud es de un tipo especial, y luego manipula la cabecera y continúa con la solicitud. Dos cabeceras se añaden en el método de manipulación que necesito para llamar a otro módulo especial ISAPI.
Así que tengo ISAPI código C ++ como:

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

Ahora quiero volver a escribir este filtro ISAPI como un módulo administrado para el IIS7. Así que tengo algo como esto:

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

Y ahora qué? La petición parece no hacer lo que debería?
Ya he escrito un módulo nativo IIS7 que implementa el mismo método. Pero este método tiene un valor de retorno con el que puedo decirle qué hacer a continuación:

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

Entonces, ¿hay una manera de enviar mi contexto manipulado de nuevo?

¿Fue útil?

Solución

Finalmente encontré. Como he dicho en los comentarios añado dos cabeceras de la petición de que se necesitaba por mi DLL que finalmente controla la solicitud. La cabecera url contiene la ruta a la DLL. Así que tengo que hacer una redirección a esa DLL.
Esto se hace con el siguiente código:

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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top