为了使进度报告过程更加可靠,并使它与请求/响应脱钩,我正在Windows Service中执行处理,并将预期的响应持久化到文件中。当客户端开始轮询更新时,其目的是控制器以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; } }
我认为,问题在于Json操作结果旨在获取一个对象(您的模型)并创建一个HTTP响应,其中包含来自模型对象的JSON格式的数据。
不过,您传递给控制器的Json方法的是一个JSON格式的 字符串对象 ,因此它将 字符串对象 “序列化”为JSON,这就是HTTP响应的内容被双引号引起来的原因(I’ m假设是问题所在)。
我想您可以考虑使用Content动作结果作为Json动作结果的替代方法,因为您实际上已经有了HTTP响应的原始内容。
return this.Content(returntext, "application/json"); // not sure off-hand if you should also specify "charset=utf-8" here, // or if that is done automatically
另一个选择是将服务中的JSON结果反序列化为一个对象,然后将该对象传递给控制器的Json方法,但是缺点是您将反序列化然后重新序列化数据,这可能是不必要的为了您的目的。