Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.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应用程序的注意事项_Asp.net_Configuration_Iis 7_Long Running Processes - Fatal编程技术网

具有长时间运行同步请求的ASP.NET应用程序的注意事项

具有长时间运行同步请求的ASP.NET应用程序的注意事项,asp.net,configuration,iis-7,long-running-processes,Asp.net,Configuration,Iis 7,Long Running Processes,在windows server 2008 64位、IIS 7.0和.NET 4.0下,如果ASP.NET应用程序(使用ASP.NET线程池、同步请求处理)长时间运行(>30分钟)。Web应用程序没有页面,主要目的是读取大块(~5MB)的大型文件(>1GB)并将其传输到客户端。代码: while (reading) { Response.OutputStream.Write(buffer, 0, buffer.Length); Response.Flush(); } 单生产者-实

在windows server 2008 64位、IIS 7.0和.NET 4.0下,如果ASP.NET应用程序(使用ASP.NET线程池、同步请求处理)长时间运行(>30分钟)。Web应用程序没有页面,主要目的是读取大块(~5MB)的大型文件(>1GB)并将其传输到客户端。代码:

while (reading)
{
    Response.OutputStream.Write(buffer, 0, buffer.Length);
    Response.Flush();
}
单生产者-实现的单消费者模式,因此每个请求有两个线程。我在这里不使用任务库,但请告诉我在这个场景中它是否比传统的线程创建有优势。使用HTTP处理程序(.ashx)而不是(.aspx)页面。在压力测试下,CPU利用率不是问题,但对于单个工作进程,在210个并发客户端之后,新连接会遇到超时。这是通过网络园艺解决的,因为我不使用会话状态。我不确定是否有什么大问题我错过了,但请让我知道你认为应该考虑哪些其他因素

例如,IIS可能由于“连接超时”而关闭长时间运行的TCP连接,因为正常的ASP.NET页面在不到5分钟的时间内处理完毕,所以我应该增加该值


我很感激你的想法。

就我个人而言,我会考虑一种不同的处理机制。HTTP请求/Web应用程序不是为这种类型的事情而设计的,稳定性将非常困难,在使用这种类型的模型时,存在许多可能导致重大问题的风险


我会将该处理转移到后端进程,这样您就不在asp.net运行时的范围内,这样您就可以更好地控制启动/关闭等操作。

长时间运行的进程不应该以这种方式实现。将此信息传递给您设置的服务

如果您想为客户挂起一个页面,请考虑将Ajax接口连接到不阻塞IO线程的东西,比如No.js.<


由于线程的使用,ASP.NET无法处理对许多客户端的推送通知,因此我的node.js。如果负载较低,您还有其他选择。

Web 1.0处理长时间运行的进程的方法是在服务器上生成它们,然后立即返回。让衍生出的服务使用进度更新数据库,站点上的页面可以查询进度

这种技术最常见的用法是获得包裹递送。在my package出现之前,您无法保持HTTP连接打开,因此它只提供了一种查询进度的方法。后台流程处理协调获取项目、包装项目、将项目放入UPS卡车等所需的所有步骤。在整个过程中,每个步骤都记录在数据库中。从概念上讲,这是一样的


基于问题编辑:只需立即返回结果页,并在服务器上生成生成的线程或进程中的二进制文件。使用Ajax检查文件是否准备就绪,并在准备就绪时提供指向该文件的链接。

首先,决不。从未。从未!在线程池线程中执行任何需要几秒钟以上的处理。它们的数量是有限的,并且它们被系统用于许多事情。这是自找麻烦

第二,虽然处理程序是一个好主意,但您对“动态生成”的含义有点模糊。您是说您正在动态加密一个文件,而此加密可能需要30分钟?或者你的意思是从数据库中提取数据并组装文件?或者下载需要30分钟

编辑:


正如我所说的,不要在任何长时间运行的情况下使用线程池。创建自己的线程,或者如果使用.NET4,则使用任务并将其指定为长时间运行

使用Web园艺可以提高应用程序的稳定性

关闭缓存,因为您没有aspx页面


如果没有性能分析,很难给出更多建议。您可以使用内置的VS并找到瓶颈。

这是一个下载网站。对于大型二进制响应,您有什么建议?(请参见编辑)发送文件,而不是使用页面发送文件…这将是我的第一项。我想知道你到底想做什么我问了一个问题:但仍然没有回答。不幸的是,stackoverflow不允许从第一天开始就对问题悬赏。你看这里经过一些编辑这里有一些答案与编辑无关。任何新的答案都有更多的机会被接受。在WAWS上,您可以使用Azure WebJobs。园艺不是长时间运行的流程的解决方案。你提出了一个好问题,这不是一个好答案。看看我的答案。