Как манипулировать заголовком, а затем продолжить с ним в C#?
Я хочу заменить старый фильтр 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;
}
Так есть ли способ отправить мой измененный контекст снова?
1 ответ
Я наконец нашел это. Как я отмечал в комментариях, я добавляю два заголовка к запросу, которые нужны моей 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);
}