我正在尝试将 Web 界面放在一个冗长的服务器端进程上,该进程应该在进程运行时向客户端发送定期进度\统计报告。我怎样才能做到这一点?
这是我到目前为止所尝试的。只要循环正在处理,webmethod 中的会话就为空。一旦循环完成并再次按下开始按钮,它就能够获取会话值并填充标签。在进程运行时,如何让它向客户端发送更新?
我正在使用 VS2012 和 ASP.NET 4.5。
编辑:更具体地说,问题发生在服务器忙于循环时。如果我取消循环并简单地尝试定期从服务器中提取变量值,那么就没有问题了。将该变量放在一个循环中并尝试定期获取它,您会看到问题所在,如果您运行它,我发布的代码应该可以澄清问题。
谢谢。
默认.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>
默认.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;
}
}
}
}