MVC执行管道:在控制器初始化之前执行Ajax调用

时间:2018-10-03 18:54:25

标签: javascript ajax asp.net-mvc controller

我对MVC中的执行顺序存在架构上的误解。

我正在覆盖我的

中的初始化
public class HomeController: Controller {

    protected override void Initialize(RequestContext requestContext)
    { 
       var myVar = "AValue";
       // basically run some internal security 
       initialization
    }

然后在我的JavaScript中,我使用递延的promise()运行了一系列10次Ajax调用。

加载设置并运行$ when

然后<-不是关键字就在另一个位置

js:

this.BeginMyAjaxQuery = function() {
   methodName:  MyAjaxQuery
};

在完全不同的Controller上,该控制器继承了HomeController

public JsonResult MyAjaxQuery()
{           
     return Perform(() =>
     { 
        return ThisQueryWithMyParameter(AValue); 
     });
 }

Perform是我们已成功用于创建JsonResults的包装器

我对MVC架构行为的误解: 当我加载URL时,在完成HomeController初始化之前,AJAX一直在它自己的线程上运行。因此,我的变量没有设置,当我进入实际的查询执行时,我收到的结果是不正确的……大多数时候,但并非总是如此。当然哪一个更令人讨厌。

我的ajax调用如何绕过我的Controller初始化并直接进入Controller方法?

让我感到困惑 将代码添加到HomeController的构造函数中的行为相同。结果不稳定。

重要的是,最后一点:使用Partial Views和KnockoutJS进行前端传递

1 个答案:

答案 0 :(得分:1)

staic问题

如前所述,您正在使用static。尽管这基本上可以从任何地方访问它,但是它还有另一个属性:它仅初始化一次,并且您赋予它的值就是所有线程上的值。 (嗯,实际上,它还有更多细微差别,例如处理器级缓存,但是我现在认为这超出了范围。)

就目前而言:您应该将其视为内存中只有1个Security User对象。如果给它一个值,它将是所有线程上的那个值。

public class HomeController: Controller {

    //note! static: the `new` is called only once!
    static SecurityUser = new SecurityUser();

    protected override void Initialize(RequestContext requestContext)
    { 
       //so SecurityUser is not a fresh object.
       //setting values will be shared between all 
       //threads (since there is only one SecurityUser object in memory

       //shared across all threads
       SecurityUser.Ip = "127.0.0.2";
    }


MVC管道

wikipedia所述:

  

在计算中,管道(也称为数据管道)是一组串联连接的数据处理元素,其中一个元素的输出是下一个元素的输入。

通常,它描述了数据流以及处理请求时涉及的动作。

到处都有关于它的文章,例如herehere

MSDN图像对其进行了很好的解释(并且完整),我在下面添加了它。

如果您查看图像,则会看到AuthenticationFiltersAuthorizationFiltersActionFilter。 (有关此信息,请参见link。)

它们的目的是为某些或所有调用的ActionMethod执行代码,身份验证等。通过使用它们,您可以隔离身份验证行为(这是一种很好的OO实践),并使代码可维护。这个想法是,您只需要定义一次特殊的安全性事物。

您可以使用它来初始化具有特定接口的对象,例如:ISecurity,具有一些属性,例如IP地址,用户名,管理员权限等。可以将对象填充到操作过滤器中,并可以对其进行解析每个http调用中都有一个依赖关系解析器。就像魅力一样。

enter image description here 图片来源:msdn