在路由匹配发生之前拦截所有WebApi调用
本文关键字:调用 WebApi 路由 | 更新日期: 2023-09-27 18:19:58
我正在寻找一种在匹配到路由之前拦截/获取请求的方法。例如,我设置了多个控制器和路由,但我想要一些在路由方法被命中之前被命中的机制。如果这种机制能够获得发送的路由参数,那将是非常可取的。
我一直找不到与我正在寻找的内容类似的东西(但可能不是很熟悉Web API,我用错误的关键字搜索)。
您需要的是操作过滤器。您可以将动作过滤器作为属性直接应用于控制器,动作过滤器的警告是,在这一点上,控制器路由已经已知,但您仍然可以控制(非常像AOP)动作方法是否可以执行:
ASP.NET Web API ActionFilter示例
看看如何使用操作过滤器,在本例中用于日志记录:
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消息处理程序
我使用上述技术来记录所有请求和响应。简而言之,最好的方法是使用Handlers。
首先,创建处理程序:
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());
创建一个HttpHandler(或者只在Global asax Application_BeginRequest事件中执行)来捕获请求,并在处理程序内部根据路由配置解析URL,类似于此链接。
就像Joel Etherton在评论中提到的那样,我认为你想要的是在你的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错误处理