1

我的一些请求如下所示:

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

并在 BeginRequest 中处理。我不希望这些请求到达呈现主页的 Home.Index 控制器操作。

我尝试使用

HttpContext.Current.ApplicationInstance.CompleteRequest();

或者

Requst.End();

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

那么如何在处理 BeginRequest 中的请求后仅阻止控制器执行呢?

4

2 回答 2

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);
    }
}
于 2012-12-02T09:09:30.373 回答
0

这里似乎更简单的选择是允许请求到达控制器并检测这种情况并简单地返回 Content() 而不是您的视图。

您还可以尝试设置一个自定义查询字符串路由约束来查找此参数,如果存在,则重定向到执行您的操作并返回 Content() 的控制器 - 您可以在此处查看查询字符串约束示例代码:我的 MVC2 应用程序可以指定路由吗对查询字符串参数的限制?

于 2012-12-01T22:59:09.877 回答