Come manipolare un colpo di testa e poi continuare con esso in C #?
-
21-09-2019 - |
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?
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);
}