我在共享主机上运行 MVC 3 应用程序,并且有一些页面需要大量处理,不应让用户等待。(例如:发送几百封带附件的邮件,在数据库中创建几千条记录。)
现在我不是在问如何实现这一目标,因为我知道如何实现,我想知道的是。如果我的应用程序正在执行操作 60 秒,它是否有停止的风险?
如果是这样,你能做些什么来防止它(知道应用程序不能完全信任地运行)?
我在共享主机上运行 MVC 3 应用程序,并且有一些页面需要大量处理,不应让用户等待。(例如:发送几百封带附件的邮件,在数据库中创建几千条记录。)
现在我不是在问如何实现这一目标,因为我知道如何实现,我想知道的是。如果我的应用程序正在执行操作 60 秒,它是否有停止的风险?
如果是这样,你能做些什么来防止它(知道应用程序不能完全信任地运行)?
由于您使用的是共享主机,您可能想查看HostingEnvironment.IncreaseBusyCount和DecreaseBusyCount。
您可能还想看看HostingEnvironment.RegisterObject,它可以让您有机会在应用程序停止之前取消正在发生的任何事情。
话虽如此,我没有尝试过任何这些,它们可能不是特别可靠。这篇文章非常相关,为什么从站点内执行此操作不是一个好主意,但我知道你在这方面被困住了。
我为此使用了Task,例如
Task.Factory.StartNew(() => this.SendRequestApprovedNotification(requestId,
userName,
comments));
我遇到的一个问题是我天真地将请求对象传递给任务。不要这样做,而是复制出您需要的位并将其传递下来,因为当您可以使用请求对象时,管道可能已经处理了它。
您可以从 web.config 控制请求执行的持续时间:
<location path="Controller/ProcessFile">
<system.web>
<httpRuntime executionTimeout="900" />
</system.web>
</location>
executionTimeout - 允许的时间(以秒为单位)
但是,我在专用服务器上使用它,而不是共享主机。