我对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进行前端传递
答案 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";
}
如wikipedia所述:
在计算中,管道(也称为数据管道)是一组串联连接的数据处理元素,其中一个元素的输出是下一个元素的输入。
通常,它描述了数据流以及处理请求时涉及的动作。
MSDN图像对其进行了很好的解释(并且完整),我在下面添加了它。
如果您查看图像,则会看到AuthenticationFilters
,AuthorizationFilters
和ActionFilter
。 (有关此信息,请参见link。)
它们的目的是为某些或所有调用的ActionMethod执行代码,身份验证等。通过使用它们,您可以隔离身份验证行为(这是一种很好的OO实践),并使代码可维护。这个想法是,您只需要定义一次特殊的安全性事物。
您可以使用它来初始化具有特定接口的对象,例如:ISecurity
,具有一些属性,例如IP地址,用户名,管理员权限等。可以将对象填充到操作过滤器中,并可以对其进行解析每个http调用中都有一个依赖关系解析器。就像魅力一样。
图片来源:msdn