我的一些要求如下:
http://mydomain.com/?q=value
并在BeginRequest中处理。 我不希望这些请求到达呈现主页的Home.Index Controller Action。
我尝试使用
HttpContext.Current.ApplicationInstance.CompleteRequest();
或
Requst.End();
但问题在于它们切断了管道,完全阻止了其他代码的执行,特别是由NewRelic完成的分析,它挂在管道事件上。
那么如何在BeginRequest处理请求后才能阻止控制器执行?
答案 0 :(得分:1)
我到目前为止找到的最佳解决方案是添加一个带
的全局动作过滤器GlobalFilters.Filters.Add(new GlobalActionAbortAttribute ());
在BeginRequest上,我用标志
标记当前上下文Context.Items["SkipRequest"] = true;
并在过滤器中过滤掉标志存在时的所有操作
public class GlobalActionAbortAttribute : System.Web.Mvc.ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if ((bool?)HttpContext.Current.Items["SkipRequest"] == true)
filterContext.Result = new EmptyResult();
else
base.OnActionExecuting(filterContext);
}
}
答案 1 :(得分:0)
这似乎是一个更简单的选择,允许请求到达控制器并检测此场景,只返回Content()而不是视图。
您还可以尝试设置查找此参数的自定义查询字符串路由约束,如果存在,则重定向到执行操作的控制器并返回Content() - 您可以在此处查看查询字符串约束示例代码:{{3 }}