【发布时间】:2012-03-19 20:50:08
【问题描述】:
为了使进度报告过程更加可靠并将其与请求/响应分离,我正在 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\":[]}"
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;
}
}
【问题讨论】:
-
你不能只返回字符串,你需要将返回类型更改为字符串。
-
您使用什么来进行 Ajax 调用(jQuery、自定义、dojo)?你能提供那个代码吗?
-
我没有看到您在控制器操作中的任何地方使用此
path变量。你在哪里读取文件的内容?您所要做的就是返回一个包含Properties.Settings.Default.EmptyBatchSearchUpdate属性内容的 JSON。您还知道当另一个线程正在写入文件时您无法读取文件吗?至少这不能以安全的方式发生。您可能很快就会遇到竞争状况。所以我认为你的设计从一开始就有缺陷。 -
@Paul 我正在使用 Ajax,我会在一分钟内发布。上面的代码已编辑,我将在几秒钟内更改它。在提琴手返回中看到的返回值准确地代表了我试图响应的 JSON 对象的正确转义的 C# 字符串。
-
是的,我已经遇到了这方面的问题,并已采取措施在 Windows 服务中阻止它。谢谢!
标签: asp.net-mvc json