Um einen Fortschrittsberichtsprozess ein wenig zuverlässiger zu gestalten und ihn von der Anforderung / Antwort zu entkoppeln, führe ich die Verarbeitung in einem Windows-Dienst durch und behalte die beabsichtigte Antwort auf eine Datei bei. Wenn der Client nach Updates fragt, beabsichtigt der Controller, den Inhalt der Datei, unabhängig davon, was sie sind, als JSON-Zeichenfolge zurückzugeben.
Der Inhalt der Datei wird in JSON vorserialisiert. Dies soll sicherstellen, dass der Antwort nichts im Wege steht. Es muss keine Verarbeitung stattfinden (es sei denn, der Dateiinhalt wird in eine Zeichenfolge eingelesen und zurückgegeben), um die Antwort zu erhalten.
Ich dachte zunächst, dies wäre ziemlich einfach, aber es stellt sich nicht heraus, dass dies der Fall ist.
Derzeit sieht meine Controller-Methode folgendermaßen aus:
Regler
Aktualisiert
[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);
}
Und Fiddler gibt dies als rohe Antwort zurück
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
Aktualisiert
Das Folgende wird wahrscheinlich später geändert, aber im Moment funktionierte dies, als ich die Antwortklasse generierte und sie wie eine normale Person als JSON zurückgab.
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;
}
}