長いサーバー側のプロセスにWebインターフェイスを配置しようとしています。このプロセスは、プロセスの実行中に定期的な進行状況/統計レポートをクライアントに送信する必要があります。これどうやってするの?
これが私がこれまでに試みたことです。ループが処理されている限り、webmethodのセッションはnullです。ループが終了し、スタートボタンをもう一度押すと、セッション値を取得してラベルにデータを入力できます。プロセスの実行中にこれを取得してクライアントに更新を送信するにはどうすればよいですか?
VS2012とASP.NET4.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;
}
}
}
}