在路由匹配发生之前拦截所有WebApi调用

我正在寻找一种方法来拦截/获取在匹配路由之前所做的请求。 例如,我有多个控制器和路由设置,但我想要一些机制,在路由方法被命中之前将被击中。 如果这种机制能够获得发送的路径参数,那将是非常可取的。

我一直无法找到类似于我正在寻找的东西(但可能不熟悉Web API我用错误的关键字搜索)。

你需要的是动作filter。 您可以将动作filter作为属性直接应用于控制器,使用Actionfilter的警告是,此时控制器路径已知,但如果可以执行操作方法,您仍然可以控制(非常类似于AOP):

ASP.NET Web API ActionFilter示例

看看如何使用动作filter,在这种情况下用于记录:

public class LogActionFilter : ActionFilterAttribute { public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { Log(actionExecutedContext.ActionContext.RequestContext.RouteData); base.OnActionExecuted(actionExecutedContext); } private void Log(System.Web.Http.Routing.IHttpRouteData httpRouteData) { var controllerName = "controller name"; var actionName = "action name"; var message = String.Format("controller:{0}, action:{1}", controllerName, actionName); Debug.WriteLine(message, "Action Filter Log"); } } 

如何记录webapi中控制器中执行的操作方法

您还可以使用在解析控制器之前执行的消息处理程序:

ASP.NET Web API中的HTTP消息处理程序

我正在使用提到的技术来记录所有请求和响应。 不久之后,最好的方法是使用Handler。

首先,创建处理程序:

 public class CustomHandler : DelegatingHandler { protected override async Task SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { //get route values and process them var routeValues = (IHttpRouteData[]) HttpContext.Current.Request.RequestContext.RouteData.Values["MS_SubRoutes"]; //let other handlers process the request return await base.SendAsync(request, cancellationToken) .ContinueWith(task => { //once response is ready, do something with it return task.Result; }, cancellationToken); } } 

然后,在WebApiConfig中注册它:

 config.MessageHandlers.Add(new CustomHandler()); 

是否可以创建一个HttpHandler(或仅在Global asax Application_BeginRequest事件中执行)来捕获请求,并在处理程序内部解析URL以防止路由配置,类似于此链接 。