Как манипулировать заголовком, а затем продолжить с ним в C #? - PullRequest
0 голосов
/ 19 марта 2010


Я хочу заменить старый фильтр 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 Ответ

0 голосов
/ 22 марта 2010

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