Pergunta


Quero substituir um filtro ISAPI antigo que foi executado no iIS6. Esse filtro verifica se a solicitação é de um tipo especial, manipula o cabeçalho e continua com a solicitação. Dois cabeçalhos são adicionados ao método de manipulação que eu preciso para chamar outro módulo ISAPI especial.
Então, eu tenho código ISAPI 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;
}

Agora, quero reescrever este filtro ISAPI como um módulo gerenciado para o IIS7. Então eu tenho algo assim:

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

E agora? O pedido parece não fazer o que deveria?
Eu já escrevi um módulo nativo do IIS7 que implementa o mesmo método. Mas esse método tem um valor de retorno com o qual posso dizer o que fazer a seguir:

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

Então, existe uma maneira de enviar meu contexto manipulado novamente?

Foi útil?

Solução

Eu finalmente encontrei. Como afirmei nos comentários, adiciono dois cabeçalhos à solicitação necessária pela minha DLL que finalmente lida com a solicitação. o url O cabeçalho contém o caminho para a DLL. Então, eu tenho que redirecionar para essa DLL.
Isso é feito com o seguinte 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top