Стремясь сделать процесс отчетности о прогрессе немного более надежным и отделить его от запроса / ответа, я выполняю обработку в службе 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);
}
И Фиддлер возвращает это как необработанный ответ
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\":[]}"
AJAX
Обновлено
Следующее, вероятно, будет изменено позже, но сейчас это работало, когда я генерировал класс ответа и возвращал его как 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;
}
}