0

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

但是这段代码是在控制器方法之后执行的,这不是我需要的。我想在之前执行处理程序,就像我在旧的 MVC 操作过滤器的pre-execute方法上做的那样。

注意 我没有使用动作过滤器,因为在 Microsfot Docs 上他们说停止使用 Web Api 2.0 的动作过滤器,因为它们将被弃用。那么,在使用 Web Api 时有什么替代方案呢?

4

1 回答 1

1

您的问题很可能是不同任务中的并发执行。await那是因为你不base.SendAsync()打电话。

这些方面的东西可能应该可以解决您的问题:

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

您实现的 MessageHandler 的执行是通过您注册它的 Web API 管道执行的,config.MessageHandlers.Add(new MyHandler());并且应该独立于任何操作过滤器

如果您正在寻找其他信息,请查看此处

于 2018-03-06T10:09:48.720 回答