【问题标题】:DelegatingHandlers not executing when routes not defined未定义路由时未执行 DelegatingHandlers
【发布时间】:2019-01-07 07:59:55
【问题描述】:

我正在开发一个 WebAPI 2 项目,该项目目前专门使用基于属性的路由,以至于注册中没有定义路由,并且一切都按预期工作。

但是,我现在添加了一个DelegatingHandler 来提供一个心跳,我可以用 HEAD 请求 ping:

public class HeartbeatMessagingHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (IsHeartbeat(request))
        {
            if (request.Method == HttpMethod.Head)
            {
                var response = new HttpResponseMessage(HttpStatusCode.NoContent) { Content = new StringContent(string.Empty) };
                var task = new TaskCompletionSource<HttpResponseMessage>();
                task.SetResult(response);
                return task.Task;
            }
        }

        return base.SendAsync(request, cancellationToken);
    }

    private static bool IsHeartbeat(HttpRequestMessage request)
    {
        return request.RequestUri.LocalPath.Equals("/Heartbeat", StringComparison.OrdinalIgnoreCase);
    }
}

但是,如果我发出预期的HEAD http://localhost/heartbeat 请求,则不会调用处理程序;如果我调用任何确实存在的路由,则调用处理程序;如果我添加一个老式路由配置,那么处理程序会在预期的/heartbeat 端点上调用。

那么,仅使用属性路由,我如何处理对“虚拟”端点的请求?

更新

消息处理程序注册如下:

config.MessageHandlers.Add(new HeartbeatMessagingHandler());
config.MessageHandlers.Add(new RequestAndResponseLoggerDelegatingHandler());
config.MessageHandlers.Add(new ApplicationInsightsMessageHandler());

所以它在例如之前注册我的全局日志处理程序,根据我的理解,消息处理程序按注册顺序接收消息。

【问题讨论】:

  • 您是否尝试过在处理程序中添加处理程序?显示 WebApiConfig。
  • 你在项目的某处有“[Route("Heartbeat")]" Action吗?
  • @Bikram 不,我没有行动;我将其实现为 DelegatingHandler,因为我特别不想为这类事情创建控制器/操作。
  • @Nkosi 我已更新问题以提供该信息
  • 与我在示例中的操作方式类似,在我已经添加其他处理程序后,我将在索引 0 处插入处理程序,以防在添加其他处理程序时它被移位。我在集成测试中对其进行了测试,每次都会调用处理程序。

标签: c# asp.net-web-api asp.net-web-api2 asp.net-web-api-routing


【解决方案1】:

很可能您的处理程序在管道中为时已晚,并且管道中更高的处理程序在请求到达您的处理程序之前将其短路。

考虑将你的处理程序插入更高的位置,这样它就有更好的机会拦截请求

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        // Web API routes
        config.MapHttpAttributeRoutes();

        // add to the front of the pipeline
        config.MessageHandlers.Insert(0, new HeartbeatMessagingHandler());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2018-08-20
    • 2018-06-30
    • 2019-12-30
    • 2017-06-21
    • 2018-12-16
    相关资源
    最近更新 更多