Web Api 预请求处理程序
Web Api Handler for pre-request
我正在使用 Web Api 2.0 的委托处理程序来拦截我所有的 Web Api 调用,我需要在 执行操作之前采取行动.
我按照 Microsoft Docs 中的说明实现了代码,如下所示:
public class MyHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
// do something
return base.SendAsync(request, cancellationToken);
}
}
并注册处理程序:
config.MessageHandlers.Add(new MyHandler());
但是这段代码是在控制器方法之后执行的,这不是我需要的。我想在 before 之前执行处理程序,就像我在旧 Action Filters for MVC 的 pre-execute 方法上所做的那样。
备注
我没有使用动作过滤器,因为在 Microsfot 文档上他们说停止使用 Web Api 2.0 的动作过滤器,因为它们将被弃用。那么,在使用 Web Api 时还有什么选择?
您的问题很可能是在不同任务中并发执行。那是因为你没有await
base.SendAsync()
调用。
按照这些思路应该可以解决您的问题:
var response = await base.SendAsync(request, cancellationToken);
return response;
您实现的 MessageHandler 的执行是通过您通过 config.MessageHandlers.Add(new MyHandler());
注册的 Web API 管道执行的,并且应该独立于任何操作过滤器
如果您正在寻找其他信息,请查看 here。
我正在使用 Web Api 2.0 的委托处理程序来拦截我所有的 Web Api 调用,我需要在 执行操作之前采取行动.
我按照 Microsoft Docs 中的说明实现了代码,如下所示:
public class MyHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
// do something
return base.SendAsync(request, cancellationToken);
}
}
并注册处理程序:
config.MessageHandlers.Add(new MyHandler());
但是这段代码是在控制器方法之后执行的,这不是我需要的。我想在 before 之前执行处理程序,就像我在旧 Action Filters for MVC 的 pre-execute 方法上所做的那样。
备注 我没有使用动作过滤器,因为在 Microsfot 文档上他们说停止使用 Web Api 2.0 的动作过滤器,因为它们将被弃用。那么,在使用 Web Api 时还有什么选择?
您的问题很可能是在不同任务中并发执行。那是因为你没有await
base.SendAsync()
调用。
按照这些思路应该可以解决您的问题:
var response = await base.SendAsync(request, cancellationToken);
return response;
您实现的 MessageHandler 的执行是通过您通过 config.MessageHandlers.Add(new MyHandler());
注册的 Web API 管道执行的,并且应该独立于任何操作过滤器
如果您正在寻找其他信息,请查看 here。