2

This is a multi-part question.

I have a process that can take several minutes to complete, it is ran by a calling a HTTPHandler using a asynchronous javascript request.

Question 1: How can I ensure that this request does not time out on both the server and the client?

Question 2: Is it possible to emit data from the HTTPHandler while processing that is sent back to the XmlHttpRequest object before the final page is completed?

I'd like to calculate actual workload and return percentage done. I'm guessing that this is possible.

Any tips?

EDIT:

A quick test:

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        for (int i = 0; i < 100; i++)
        {
            context.Response.Write("Hello World " + i + Environment.NewLine);
            System.Threading.Thread.Sleep(500);
            context.Response.Flush();
        }            
    }

Pushes Hello World bit by bit to the client...This works on a synchronious request, I'll see if a xmlHttpRequest gets a readystatechange event for each line.

I've always avoiding multithreading on ASP.NET apps because you don't have control of when the working process will die, which will result in all of its spawned threads dieing.

Instead, why re-invent a separate thread pool when IIS is already doing this for you.

4

6 回答 6

1

我过去所做的是在一个新线程上启动长时间运行的进程,并在进程类上有一个属性来说明完成百分比。然后每隔一段时间,浏览器就可以对 HttpHandler 进行 AJAX 调用,该 HttpHandler 只是轮询该 % complete 属性。这样 HttpHandler 立即返回。

如果作业很重要,可能需要考虑一些问题,例如缓解工作进程以回收中间作业或保存作业的状态以便重新启动它。如果作业非常关键,最好写一个Windows Service来执行作业,并使用Remoting之类的来查询进度。

于 2009-03-05T23:25:11.040 回答
0

根据定义,HTTP 请求是无状态的。正如其他人指出的那样 - 您无法预测 IIS 何时会回收该进程。

更好的方法是创建一个 Windows 服务来完成实际工作,并创建一个 HTTPHandler 或页面或其他任何东西来查询它的进度并将其返回给客户端。您可以在同一台机器上安装服务,然后使用管道或任何您想在页面/处理程序与服务之间连接的远程通道。

于 2009-03-06T00:40:33.307 回答
0
  1. 您可以在 web.config 中更改请求超时值,例如: <configuration> <system.web><httpRuntime executionTimeout="1000" /></system.web></configuration>

  2. 据我所知,没有办法将信息发送回同一个异步请求。我见过的大多数 Ajax UI 都是通过拥有一个静态类来创建该行为的,该类保存正在运行的任务的统计信息,然后使用另一个异步请求或 iframe 轮询它。类似的一个很好的例子是Neat Upload Control

于 2009-03-05T23:25:55.547 回答
0

这是一个想法...

如果您有一个需要“几分钟”来处理的进程,则最好创建一个单独的线程(或单独的线程队列),而不是使用 ASP.NET 工作线程。这是因为如果您用完所有工作线程,那么您的 Web 服务器可能会挂起。有关此问题的更多信息:http: //msdn.microsoft.com/en-us/magazine/cc164128.aspx

您的第一个 AJAX 请求是启动该进程。随后的调用将获取进程的状态,包括完成百分比。使用计时器进行轮询(每隔几秒或似乎最有效的方式)以获取完成百分比,直到全部完成。

AJAX 请求(XmlHttpRequest)在客户端本身没有超时(http://luke.breuer.com/tutorial/xmlhttprequest.aspx ...向下滚动到超时),但我不认为这是一个好的如果可能的话,让他们休息几分钟做工作的想法:

于 2009-03-05T23:26:25.700 回答
0

物有所值,

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/plain";
    for (int i = 0; i < 100; i++)
    {
        context.Response.Write("Hello World " + i + Environment.NewLine);
        System.Threading.Thread.Sleep(500);
        context.Response.Flush();
    }            
}

在客户端:

httpObject.onreadystatechange = function()
{
    // This is called whenever Flush() is called on the server.
    // when readyState = 4, everything is done, but I can check responseText at anytime.
}

工作得很好。

于 2009-03-06T04:29:03.477 回答
-2

从这个网站下载源文件

http://www.stonebroom.com/dafiles/6744-code.zip

检查 url ~/loadpost/stagedloading.aspx。

于 2009-03-05T23:26:36.637 回答