Jquery 通过asp.net从后台进程更新浏览器跟踪警报

Jquery 通过asp.net从后台进程更新浏览器跟踪警报,jquery,asp.net,ajax,trace,progress,Jquery,Asp.net,Ajax,Trace,Progress,我有一个webservice方法,它接受一个Id,然后启动一个类库来处理关于给定Id的一些信息 处理器使用Trace.Write()来报告进度。这在控制台应用程序上运行良好,但我希望能够通过web将相同的信息发送回用户 捕获这些跟踪事件(发生速度非常快,每秒很多)并将其发送到浏览器的最佳方式是什么 我可以存储整个跟踪,并在流程完成时发送回,但如果它可以在发生时流式传输到浏览器,那么它将向用户提供用户反馈以及有关流程的信息 这是一个ASP.NET服务,ashx文件 实现这一目标的最佳方式是什么 提

我有一个webservice方法,它接受一个Id,然后启动一个类库来处理关于给定Id的一些信息

处理器使用Trace.Write()来报告进度。这在控制台应用程序上运行良好,但我希望能够通过web将相同的信息发送回用户

捕获这些跟踪事件(发生速度非常快,每秒很多)并将其发送到浏览器的最佳方式是什么

我可以存储整个跟踪,并在流程完成时发送回,但如果它可以在发生时流式传输到浏览器,那么它将向用户提供用户反馈以及有关流程的信息

这是一个ASP.NET服务,ashx文件

实现这一目标的最佳方式是什么

提前谢谢

以下是我启动该过程的代码:

function ProcessEmail(emailId) {
        var popupcontent = $("#EmailPopUp");
        $.ajax({
            type: "POST",
            async: false,
            url: "/MailboxPro/Methods/Emails.ashx?action=TestProgress",
            data: { EmailId: emailId },
            success: function (result) {
                alert("result");
            }
        });
    }

好的,其中一种方法是使用将跟踪输出连接到响应。已经存在一个将跟踪输出写入响应的实现-查看。如果此侦听器的输出格式不符合您的喜好,您可以随时编写自己的跟踪侦听器。这里重要的一点是关闭对响应输出的缓冲(使用属性),以便立即将更新发送到客户端。您还需要保持您的请求处于活动状态,即
ProcessRequest
在流程完成之前不应结束。您必须在ASP.NET配置中根据进程所用的时间调整请求超时设置


或者,您可以选择立即返回ashx,然后定期发出ajax请求以获取流程更新。同样,您必须捕获跟踪输出并将其存储在某些存储器(例如,内存或文件)中,并在ajax请求进程更新时将其返回。

问题是由于侦听器仍然“连接”到输出而导致的


在流程结束时调用
Listeners.Remove(myListener)
,这意味着它将在以后的每一次都能工作。

我也通过ajax调用该方法,并且在响应完成之前,“Success”函数似乎不会运行。我是否应该以另一种方式启动流程?@Simon,我相信您的ashx启动了对请求线程的实际处理。您可以使用
ThreadPool.QueueUserWorkItem
在不同的线程上启动它-这样您的ashx将立即返回。对于进度更新,您需要从java脚本进行后续ajax调用。我可以让它第一次工作。ASHX将跟踪响应流回到浏览器。任何后续的尝试都会返回一个错误,说明无法写入已完成的响应,但每次都是一个新请求,当然?@Simon,如果您正在写入ashx的响应流,那么您可以在不同的线程中启动处理,因为您需要保持请求运行。如果您使用不同的线程,那么您必须在会话中捕获跟踪输出,并在发出下一个ajax请求时将其返回。请注意,下一个请求将使用一些不同的语义,例如,一个查询参数来指示它正在请求来自上一个请求的状态更新。该过程只需10/15秒,因此我可以一次性发送整个输出,但一点进度更新似乎很有用。我只是不明白为什么它第一次起作用,但随后就不起作用了。检索结果的轮询实际上不起作用,因为处理时间太短。