【发布时间】: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