Как манипулировать заголовком и затем продолжить его работу на С#?
-
21-09-2019 - |
Вопрос
Я хочу заменить старый фильтр ISAPI, работавший в IIS6.Этот фильтр проверяет, является ли запрос особым типом, затем манипулирует заголовком и продолжает обработку запроса.В манипулирующий метод добавляются два заголовка, которые мне нужны для вызова другого специального модуля ISAPI.
Итак, у меня есть код ISAPI C++, например:
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;
}
Теперь я хочу переписать этот фильтр ISAPI как управляемый модуль для IIS7.Итак, у меня есть что-то вроде этого:
private void OnMapRequestHandler(HttpContext context)
{
ManipulateHeaderInSomeWay(context);
}
И что теперь?Кажется, запрос не делает того, что должен?
Я уже написал собственный модуль IIS7, реализующий тот же метод.Но у этого метода есть возвращаемое значение, с помощью которого я могу сказать, что делать дальше:
REQUEST_NOTIFICATION_STATUS CMyModule::OnMapRequestHandler(IN IHttpContext *pHttpContext, OUT IMapHandlerProvider *pProvider)
{
if (DoSomething(pHttpContext))
{
return RQ_NOTIFICATION_CONTINUE;
}
return RQ_NOTIFICATION_FINISH_REQUEST;
}
Итак, есть ли способ снова отправить мой измененный контекст?
Решение
Я наконец нашел это.Как я уже говорил в комментариях, я добавляю к запросу два заголовка, которые необходимы моей DLL, которая, наконец, обрабатывает запрос.А url
заголовок содержит путь к DLL.Поэтому мне нужно сделать перенаправление на эту DLL.
Это делается с помощью следующего кода:
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);
}