最佳答案
为了使进度报告过程更加可靠,并使其与请求/响应分离,我在 Windows 服务中执行处理,并将预期的响应持久化到一个文件中。当客户端开始轮询更新时,目的是控制器以 JSON 字符串的形式返回文件的内容,不管它们是什么。
文件的内容被预序列化为 JSON。这是为了确保没有任何东西阻碍响应。不需要进行任何处理(除非将文件内容读入字符串并返回它)就可以获得响应。
我最初以为这会相当简单,但事实并非如此。
目前我的控制器方法如下:
[HttpPost]
public JsonResult UpdateBatchSearchMembers()
{
string path = Properties.Settings.Default.ResponsePath;
string returntext;
if (!System.IO.File.Exists(path))
returntext = Properties.Settings.Default.EmptyBatchSearchUpdate;
else
returntext = System.IO.File.ReadAllText(path);
return this.Json(returntext);
}
Fiddler 把这个作为原始反应返回
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 19 Mar 2012 20:30:05 GMT
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 3.0
Cache-Control: private
Content-Type: application/json; charset=utf-8
Content-Length: 81
Connection: Close
"{\"StopPolling\":false,\"BatchSearchProgressReports\":[],\"MemberStatuses\":[]}"
下面的内容可能稍后会更改,但是目前这种方法在我生成响应类并像正常人一样将其返回为 JSON 时仍然有效。
this.CheckForUpdate = function () {
var parent = this;
if (this.BatchSearchId != null && WorkflowState.SelectedSearchList != "") {
showAjaxLoader = false;
if (progressPending != true) {
progressPending = true;
$.ajax({
url: WorkflowState.UpdateBatchLink + "?SearchListID=" + WorkflowState.SelectedSearchList,
type: 'POST',
contentType: 'application/json; charset=utf-8',
cache: false,
success: function (data) {
for (var i = 0; i < data.MemberStatuses.length; i++) {
var response = data.MemberStatuses[i];
parent.UpdateCellStatus(response);
}
if (data.StopPolling = true) {
parent.StopPullingForUpdates();
}
showAjaxLoader = true;
}
});
progressPending = false;
}
}