Como manipular um cabeçalho e depois continuar com ele em C#?
-
21-09-2019 - |
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?
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);
}