在 EndRequest 中所做的 Cookie 更改不会在 Response 中发送

Cookie changes made in EndRequest are not sent in Response

我在 EndRequest 方法中有修改 cookie 的逻辑,这在 WebForms 和 MVC 中完美运行1.

但我刚刚发现它在 WebApi 中不起作用,即使它看起来应该如此。

当我调用 WebApi 方法时 MyMethod,如果该方法设置了 cookie,我会在响应中看到它。但是即使 EndRequest MyMethod 之后触发 并且 设置 所需的 cookie,更新后的 cookie 不会 在请求中发送。您似乎无法修改 EndRequest 中的 Response cookies,但我不知道为什么,也不知道该怎么办。

任何人都可以告诉我这里发生了什么,以及如何处理它以便我可以 运行 我需要的逻辑而不必在每个 Web 方法中显式调用它吗?如果我需要修改响应,在 WebApi 中捕获 EndRequest 意图的正确方法是什么?


[1] 这与问题没有直接关系,但原因是我可以通过散列 cookie 值并向 cookie 添加 hash 密钥来保护 cookie 免受篡改。我调用逻辑来保护来自 EndRequest 的 cookie,以便在我的应用程序代码中,我可以使用 cookie 做任何我需要的事情,并在我知道我已完成对 cookie 内容的所有更改后保护所有内容。

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());