Comment manipuler un en-tête puis continuer en C #?
-
21-09-2019 - |
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é?
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);
}