首页 > 解决方案 > ASP .NET 应用程序中的每个请求是否都部署在 IIS 中,被视为线程还是轻量级进程?

问题描述

我在 IIS 中部署了一个.NET MVC应用程序。收到请求后,我应该开始工作(可能需要几个小时才能完成)。因此,我在我的控制器层内创建了一个线程并让线程异步完成工作,请求线程正在向客户端返回一个 id。在调试时,我发现我在控制器层中创建的线程也在请求线程结束后立即结束(即 http 请求周期结束并且响应返回给客户端)。我尝试使用普通线程库和系统线程池创建线程。所有线程都是前台。我仍然无法弄清楚为什么新创建的线程应该在请求线程退出后立即结束。我的预感是,对于每个新请求,IIS 可能会创建一个轻量级进程. 由于这个线程是从一个进程创建的,它也应该在进程退出时退出(在这种情况下,进程应该在 http 请求完成时退出),这是唯一合理的解释。我在这里正确吗?任何线索将不胜感激。

标签: asp.netmultithreadingasp.net-mvc-4iis-7

解决方案


请求具有由服务器定义的显式超时。我忘记了默认值是什么,但是这个明确的超时肯定会比几个小时短。有关更多信息,请参阅此帖子:如何为长时间运行的查询增加 executionTimeout?

<system.web>
   <httpRuntime  executionTimeout = "SOME LARGE VALUE" />

这会增加应用程序中所有页面的超时时间,因此使用 location 元素为一个路径定义它是理想的:

<location path="Pathtolongrunningtask">
    <system.web>
       <httpRuntime  executionTimeout = "SOME LARGE VALUE" />

maxRequestLength 元素也增加了可以下载的数据的最大大小,因此如果这是一个要下载的大文件,则更新该设置也很重要。

我们过去取得的一些成功是加载页面并通过 AJAX 调用发起请求,然后等待该调用完成。一个常见的问题是由于某种原因,用户的会话会死掉,这会阻止进程完成,所以我们需要添加一个保持活动机制,当它等待响应时,会话不会死并记录用户出。

通常,在 HTTP 生命周期内执行此操作可能会出现问题 - 如果您可以使用 Windows 任务或 Azure Web Worker 或 HTTP 生命周期之外的东西,那会更好。


推荐阅读