不要一遍又一遍地请求相同信息的最佳方法

时间:2011-05-10 09:00:43

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

在我的控制器上,我继承了 MainController ,并在那里覆盖了InitializeOnActionExecuting

在这里,我看到了什么是URL,我可以查看客户端是什么,但我了解到,对于每个调用的方法,这会一次又一次地被激发,即使是简单的{{ 1}}将触发同一个控制器的初始化。

有没有更好的技术来避免重复数据库调用?我正在使用实体框架,所以它将花费时间来调用数据库,因为它已经在缓存中产生了结果,但是......只是想知道是否有更好的技术< / strong>现在在MVC3中而不是在会话变量

中托管变量

示例代码

redirectToAction

仍然最好这样做:

public class MyController : MainController
{
    public ActionResult Index()
    {
        return View();
    }
}


public class MainController : Controller
{

   public OS_Clients currentClient { get; set; }

   protected override void Initialize(System.Web.Routing.RequestContext requestContext)
   {
        // get URL Info
        string url = requestContext.HttpContext.Request.Url.AbsoluteUri;
        string action = requestContext.RouteData.GetRequiredString("action");
        string controller = requestContext.RouteData.GetRequiredString("controller");
        object _clientUrl = requestContext.RouteData.Values["cliurl"];

        if (_clientUrl != null && _clientUrl.ToString() != "none")
        {
            // Fill up variables
            this.currrentClient = db.FindClientById(_clientUrl.ToString());
       }

        base.Initialize(requestContext);
    }

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // based on client and other variables, redirect to Disable or Login Actions
        // ... more code here like:

        //  filterContext.Result = RedirectToAction("Login", "My");

        base.OnActionExecuting(filterContext);
    }
}

2 个答案:

答案 0 :(得分:2)

在这种情况下,您似乎要处理应用程序安全性,我建议创建Authorization过滤器,该过滤器很早就会进入操作。您可以将权限检查代码放在那里,如果权限不符合AuthorizeCore,框架将自动将用户重定向到登录页面。

接下来,如果用户有权限,您可以使用HttpContext.Items作为请求级别缓存。然后你可以创建另一个ActionFilter并执行动作,或者你可以使用基本控制器从Httpcontext.items中获取用户并将其分配给控制器属性。

如果您使用的是asp.net mvc 3,那么您可以使用GlobalFilters注册上述过滤器,而不是装饰每个控制器。

希望有所帮助。

答案 1 :(得分:0)

在基本控制器中,您需要将第一个调用的结果缓存在Session变量中。

这确保不会不必要地调用后端(DB),并且数据绑定到用户的Session而不是跨用户共享,就像应用程序缓存一样。