停止在BeginRequest中到达Controller的请求

时间:2012-11-29 10:14:33

标签: asp.net asp.net-mvc-3

我的一些要求如下:

http://mydomain.com/?q=value

并在BeginRequest中处理。 我不希望这些请求到达呈现主页的Home.Index Controller Action。

我尝试使用

HttpContext.Current.ApplicationInstance.CompleteRequest();

Requst.End();

但问题在于它们切断了管道,完全阻止了其他代码的执行,特别是由NewRelic完成的分析,它挂在管道事件上。

那么如何在BeginRequest处理请求后才能阻止控制器执行?

2 个答案:

答案 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 }}