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

时间:2015-10-29 20:02:47

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

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

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

4 个答案:

答案 0 :(得分:8)

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

ASP.NET Web API ActionFilter example

了解如何使用动作过滤器,在本例中为日志记录:

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");
    }
}

How to log which action method is executed in a controller in webapi

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

HTTP Message Handlers in ASP.NET Web API

答案 1 :(得分:4)

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

首先,创建处理程序:

public class CustomHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> 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());

答案 2 :(得分:0)

是否可以创建HttpHandler(或仅在Global asax Application_BeginRequest事件中执行)来捕获请求,并在处理程序内部根据路由配置解析URL,类似于this link

答案 3 :(得分:0)

就像评论中提到的乔尔·埃瑟顿一样,我认为您正在寻找的东西就像在global.asax中添加以下代码:

protected void Application_EndRequest()
{
    /*
    if(HttpContext.Current.Response.StatusCode == 404)
        Debug.WriteLine("404 something something")
    if(HttpContext.Current.Response.StatusCode == 500)
        Debug.WriteLine("500 something something")
    if(HttpContext.Current.Response.StatusCode == 200)
        Debug.WriteLine("200 something something")
    */
    Debug.WriteLine($"{context.Response.StatusCode} - {request.Url.PathAndQuery}");
}

我从这里得到了灵感:ASP.NET MVC 404 Error Handling