Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 具有UnityContainer会话状态的ASP.NET MVC依赖项注入_Asp.net Mvc_Dependency Injection - Fatal编程技术网

Asp.net mvc 具有UnityContainer会话状态的ASP.NET MVC依赖项注入

Asp.net mvc 具有UnityContainer会话状态的ASP.NET MVC依赖项注入,asp.net-mvc,dependency-injection,Asp.net Mvc,Dependency Injection,我有一个asp.net mvc网站,在那里我利用了Micorosoft.Practices.Unity和Microsoft.Practices.ObjectBuilder2的依赖注入功能。通过将对象注入控制器构造函数,这一切都非常有效 问题是,当用户离开浏览器或想要注销时,我很难清除此会话。所有值都保留在对象中。如何在会话结束时或由用户单击并由控制器操作处理时销毁在global.asax中创建的容器 下面是一些示例代码 Global.asax-从会话开始执行: 会话_End直到用户离开30分钟后

我有一个asp.net mvc网站,在那里我利用了Micorosoft.Practices.Unity和Microsoft.Practices.ObjectBuilder2的依赖注入功能。通过将对象注入控制器构造函数,这一切都非常有效

问题是,当用户离开浏览器或想要注销时,我很难清除此会话。所有值都保留在对象中。如何在会话结束时或由用户单击并由控制器操作处理时销毁在global.asax中创建的容器

下面是一些示例代码

Global.asax-从会话开始执行:


会话_End直到用户离开30分钟后才会启动。我也曾在ASP.NET中遇到过会话的麻烦

如果您调用Session.放弃,您可以强制启动Session\u end。但如果用户离开您的网站或关闭浏览器,这并不能解决您的问题

当他们离开页面时,您可以使用javascript事件和webservice调用来结束他们的会话。这与试图阻止用户在保存工作之前离开的逻辑类似

这有什么问题吗?它将在每次页面转换时终止会话

不过,我以前做过一个页面,其中一些功能会导致弹出窗口阻止用户离开,而其他功能(如发回)则不会触发事件。我最后要做的是在页面加载上设置一个var,然后在与某些控件或链接交互时修改该var

var endUserSession = true;

window.onbeforeunload = endSession;

function endSession() {
    if(endUserSession) {
        //end session here through some kind of call back to the server
    }
}
虽然这是一个非常具有侵入性的实现,需要大量的工作和集成才能在站点范围内实现,但它可以工作,尽管要使回发不触发结束会话将非常耗时

根据我个人的经验,最好让会话自行处理,而不必担心它何时到期。我花了太多的时间来解决会议期间的问题。IIS应该为您处理它,您可以进入工作进程并更改重新启动WP和清除会话的频率

如果这里的问题与可用的系统资源有关:即站点只是占用了大量内存,而转储会话不是一个选项,那么您可以实现Sql Server状态服务器,然后根据需要回收工作进程


会话_End直到用户离开30分钟后才会启动。我也曾在ASP.NET中遇到过会话的麻烦

如果您调用Session.放弃,您可以强制启动Session\u end。但如果用户离开您的网站或关闭浏览器,这并不能解决您的问题

当他们离开页面时,您可以使用javascript事件和webservice调用来结束他们的会话。这与试图阻止用户在保存工作之前离开的逻辑类似

这有什么问题吗?它将在每次页面转换时终止会话

不过,我以前做过一个页面,其中一些功能会导致弹出窗口阻止用户离开,而其他功能(如发回)则不会触发事件。我最后要做的是在页面加载上设置一个var,然后在与某些控件或链接交互时修改该var

var endUserSession = true;

window.onbeforeunload = endSession;

function endSession() {
    if(endUserSession) {
        //end session here through some kind of call back to the server
    }
}
虽然这是一个非常具有侵入性的实现,需要大量的工作和集成才能在站点范围内实现,但它可以工作,尽管要使回发不触发结束会话将非常耗时

根据我个人的经验,最好让会话自行处理,而不必担心它何时到期。我花了太多的时间来解决会议期间的问题。IIS应该为您处理它,您可以进入工作进程并更改重新启动WP和清除会话的频率

如果这里的问题与可用的系统资源有关:即站点只是占用了大量内存,而转储会话不是一个选项,那么您可以实现Sql Server状态服务器,然后根据需要回收工作进程


第一位评论者提到的这种方法的问题是,您正在创建一个与会话关联的容器,并将与该容器关联的对象的生命周期设置为会话

真的,你不需要两者都做。注册将容器与会话关联,或将对象的生存期设置为会话

我更喜欢将对象的生存期设置为session,因为它使容器创建更干净。只需将容器创建移动到应用程序级别。当用户(即唯一会话)请求使用容器注册的对象类型,并且该对象的生存期为会话时,它将在该用户的会话中查找该对象。如果找不到,它会将其添加到会话中。如果找到,它将从会话返回。如果另一个用户来了
如果长时间请求相同类型的对象,则会出现相同的模式,因为对象的备份存储对于每个用户都是唯一的。

此方法的问题,第一位评论者提到的是,您正在创建一个与会话关联的容器,并将与该容器关联的对象的生存期设置为会话

真的,你不需要两者都做。注册将容器与会话关联,或将对象的生存期设置为会话


我更喜欢将对象的生存期设置为session,因为它使容器创建更干净。只需将容器创建移动到应用程序级别。当用户(即唯一会话)请求使用容器注册的对象类型,并且该对象的生存期为会话时,它将在该用户的会话中查找该对象。如果找不到,它会将其添加到会话中。如果找到,它将从会话返回。如果另一个用户出现并请求相同类型的对象,则会出现相同的模式,因为该对象的备份存储对于每个用户都是唯一的。

也许我弄错了,但您所做的看起来很可怕,好像您正在尝试使用每会话容器。。我想说的第一件事是——除非你有逻辑在别处调用“SetControllerFactory”。。你应该做好准备,因为SetControllerFactory为整个应用程序设置控制器工厂。。不是会话。也许我弄错了,但是您所做的看起来很可怕,好像您正在尝试使用每个会话的容器。。我想说的第一件事是——除非你有逻辑在别处调用“SetControllerFactory”。。你应该做好准备,因为SetControllerFactory为整个应用程序设置控制器工厂。。不是会议。
window.onbeforeunload = endSession;

function endSession() {
    //end session here through some kind of call back to the server
}
var endUserSession = true;

window.onbeforeunload = endSession;

function endSession() {
    if(endUserSession) {
        //end session here through some kind of call back to the server
    }
}