【发布时间】:2012-11-23 08:54:22
【问题描述】:
我正在尝试将 Web 界面放在一个冗长的服务器端进程上,该进程应该在进程运行时向客户端发送定期进度\统计报告。我怎样才能做到这一点?
这是我到目前为止所尝试的。只要循环正在处理,webmethod 中的会话就为空。一旦循环完成并再次按下开始按钮,它就能够获取会话值并填充标签。如何在进程运行时将更新发送到客户端?
我正在使用 VS2012 和 ASP.NET 4.5。
编辑:更具体地说,问题发生在服务器忙于循环时。如果我取消循环并简单地尝试定期从服务器中提取变量值,那么就没有问题了。将该变量放入一个循环中并尝试定期获取它,您将看到问题所在,如果您运行它,我发布的代码应该可以澄清问题。
谢谢。
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ClientProgressTest.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
function GetCount() {
$.ajax({
type: "POST",
url: "Default.aspx/GetCount",
contentType: "application/json; charset=utf-8",
data: {},
dataType: "json",
success: function (data) {
lblCount.innerHTML = data.d;
},
error: function (result) {
alert(result.status + ' ' + result.statusText);
}
});
setTimeout(GetCount, 5000);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<label id="lblCount"></label>
<br />
<br />
<asp:Button ID="btnGetCount" runat="server" Text="Get Count" OnClientClick="GetCount();" OnClick="btnGetCount_Click" />
</div>
</form>
</body>
</html>
Default.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace ClientProgressTest
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
[WebMethod(EnableSession = true)]
public static string GetCount()
{
string count = null;
if (HttpContext.Current.Session["count"] != null)
{
count = HttpContext.Current.Session["count"].ToString();
}
return count;
}
protected void btnGetCount_Click(object sender, EventArgs e)
{
Session["count"] = null;
for (int i = 0; i < 10000000; i++)
{
Session["count"] = i;
}
}
}
}
【问题讨论】:
-
如果您不太关心对旧版浏览器的支持,这听起来是个使用web api 和web sockets 的好地方。
-
考虑使用 ajax 调用中的
complete:来启动计时器。现在,您的计时器可以在 ajax 调用完成之前到期,从而导致新的 ajax 调用在前一个调用完成之前开始。
标签: c# javascript asp.net asp.net-4.5