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