Question


Je veux remplacer un vieux filtre ISAPI qui a couru sur IIS6. Ce filtre vérifie si la demande est d'un genre particulier, manipule l'en-tête et se poursuit avec la demande. Deux têtes sont ajoutés dans la méthode de manipulation que j'ai besoin pour appeler un autre module ISAPI spécial.
J'ai ISAPI code C ++ comme:

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

Je veux maintenant réécrire ce filtre ISAPI en tant que module géré pour le IIS7. J'ai donc quelque chose comme ceci:

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

Et maintenant quoi? La demande ne semble pas faire ce qu'il faut?
je l'ai déjà écrit un module natif IIS7 qui implémente la même méthode. Mais cette méthode a une valeur de retour avec laquelle je peux dire quoi faire:

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

est-il un moyen d'envoyer mon nouveau contexte manipulé?

Était-ce utile?

La solution

Je l'ai enfin trouvé. Comme je l'ai dit dans les commentaires ajouter deux têtes à la demande qui sont nécessaires par ma DLL qui gère enfin la demande. L'en-tête de url contient le chemin vers la DLL. Je dois donc faire une redirection vers cette DLL.
Cela se fait avec le code suivant:

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top