2011-05-04 16 views
0

我有一个web服务方法,它需要一个Id然后启动一个类库来处理一些关于给定的ID的信息。通过asp.net从后台进程更新浏览器跟踪警报

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

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

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

这是一个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"); 
      } 
     }); 
    } 

回答

0

问题是由听者仍然“附着”到输出引起的。

在流程结束时调用Listeners.Remove(myListener),这意味着它将在随后的每个时间都有效。

0

好,方式之一可能是跟踪输出挂钩使用TraceListener的响应。已经有一个将跟踪输出写入响应的实现 - 查看WebPageTraceListener。如果这个侦听器的输出格式不符合您的需要,您可以随时编写自己的跟踪侦听器。这里最重要的是关闭缓冲你的响应输出(使用BufferOutput属性),以便你的更新立即发送到客户端。您还需要保持您的请求存活 - 即ProcessRequest不应该结束,直到您的过程完成。根据您的流程需要多长时间,您必须在ASP.NET配置中调整请求超时设置。

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

+0

我也通过ajax调用方法,并且“成功”函数似乎不会运行,直到响应完成。我应该以不同的方式启动流程吗? – Simon 2011-05-04 09:51:08

+0

@Simon,我相信你的ashx会启动实际处理请求线程。你可以使用'ThreadPool.QueueUserWorkItem'在不同的线程上启动它 - 这样你的ashx将立即返回。对于进度更新,您需要从java-script进行后续ajax调用。 – VinayC 2011-05-05 04:33:02

+0

我可以让它第一次工作。 ASHX将跟踪响应传回给浏览器。任何后续的尝试将返回一个错误,说不能写入已完成的响应,但每次都是新请求,当然? – Simon 2011-05-11 11:50:53