2015-01-22 2 views
1

У меня есть логика, которая изменяет файлы cookie в методе EndRequest, и это отлично работает в WebForms и MVC .Изменения в Cookie, внесенные в EndRequest, не отправляются в Response

Но я только что обнаружил, что он не работает в WebApi, хотя он выглядит так, как должен.

Когда я вызываю метод WebApi MyMethod, если метод устанавливает cookie, я вижу его в ответе. Но даже если EndRequestделает огнь после MyMethod и делает набор необходимого печенье, обновленный печенье не получить посланный в запросе. Похоже, что вы не можете изменить файлы cookie ответов в EndRequest, но я не могу понять, почему и что с этим делать.

Может ли кто-нибудь сказать мне, что здесь происходит, и что с этим делать, чтобы я мог использовать свою логику без явного вызова ее в каждом веб-методе? Если мне нужно изменить ответ, каков правильный способ зафиксировать намерение EndRequest в WebApi?


[1] Это не имеет прямое отношение к вопросу, но причина в том, чтобы я мог защитить печенье от подделки путем хеширования значений печенья и добавления hash ключа к печенью. Я вызываю логику для защиты файлов cookie от EndRequest, так что в своем коде приложения я могу делать все, что мне нужно, с помощью куки-файлов и защищать все, как только я знаю, что все сделано с изменениями в содержании файлов cookie.

ответ

1

EndRequest - последнее событие в конвейере, которое должно быть выполнено. Он вызывается после отправки ответа. Вы не можете использовать его для управления ответом. Чаще всего используются протоколирование и обработка транзакций.

Вам следует рассмотреть возможность внедрения HttpMessageHandler.

public class MyHttpMessageHandler : DelegatingHandler 
{   
    protected async override Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, 
     CancellationToken cancellationToken) 
    { 
     // do something with request ... 
     // ... 

     // process request 
     var response = await base.SendAsync(request, cancellationToken); 

     // do something with response 
     // ... 

     return response; 
    } 
} 

Затем вам нужно зарегистрировать его

GlobalConfiguration.Configuration 
        .MessageHandlers 
        .Add(new HttpMessageHandler()); 
+0

Спасибо, я попробовал это, и она работала отлично. Но почему WebApi вызывает EndRequest после того, как он уже отправил ответ? –

+0

'EndRequest' - это последнее событие в конвейере, которое должно быть выполнено. Он вызывается после отправки ответа. Вы не можете использовать его для управления ответом. Чаще всего используются протоколирование и обработка транзакций. –

+1

Но тогда почему это работает, чтобы модифицировать файлы cookie в EndRequest при использовании WebForms или MVC? У меня только эта проблема в WebApi. –

Смежные вопросы