Mar*_*arc 1 c# asp.net-mvc asp.net-ajax c#-4.0 asp.net-mvc-3
我正在开发一个使用MVC3,Razor,C#4,jQuery的Web应用程序.
在一个屏幕(页面)中,我对控制器操作进行AJAX调用以获得一些屏幕更新.使用Javascripts setTimeout()我进行轮询.
为了在服务器没有屏幕更新的情况下优化此轮询,我喜欢延迟HTTP响应并等待一段时间,直到我a)获得屏幕更新或b)达到一些超时(例如10秒左右).
我试着这样做
[OutputCache(Duration = 0)]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult CheckForUpdates()
{
var startTime = DateTime.Now;
while (_haveUpdates || DateTime.Now > startTime.AddSeconds(10 ))
{
Thread.Sleep(3);
}
return _haveUpdate ? Json(new {updates = ... }, JsonRequestBehavior.AllowGet) : null;
}
Run Code Online (Sandbox Code Playgroud)
在视图中我使用Javascript/jQuery,如下所示:
<script>
$(function () {
scheduleNextCheck();
});
function scheduleNextCheck() {
setTimeout(function() {
$.ajax({
url: "@Url.Action("CheckForUpdates")",
dataType: 'json',
data: null,
timeout: 10000,
cache: false,
success: function(data) {
if (data != null && data.updates != null ) {
// Apply Updates
} else {
scheduleNextCheck();
}
},
error: function() {
scheduleNextCheck();
}
});
}, 2000);
}
Run Code Online (Sandbox Code Playgroud)
使用此代码时,IIS7工作进程将完全挂起/冻结,因此只有杀死工作进程才能解锁整个IIS7服务器.所以Thread.Sleep()似乎不是一个好主意.至少不是我的应用程序环境.
有没有人用ASP.Net MVC做这样的事情还是有任何想法?
Thx,Marc
====更新:====
发现其中一个问题:虽然标准是错误的.它应该是这样的:
while (noUdates && DateTime.Now < startTime.AddSeconds(10))
Run Code Online (Sandbox Code Playgroud)
现在的问题是在睡眠延迟循环运行时取消了其他AJAX请求.
关于SignalR:必须仔细看看,但问题是这需要额外的服务器端和客户端库,我必须获得批准,因此我希望能够实现"简单"的小型解决方案,减少影响,减少培训需求.但SignalR仍然是下一个版本之一的选项,可以取代民意调查 - 但需要首先获得一些培训和经验.
====更新2:====
我正在寻找一个没有额外的库/框架的解决方案,所以我可以将它应用到几乎完成的Web应用程序而不会产生巨大的影响.
| 归档时间: |
|
| 查看次数: |
4054 次 |
| 最近记录: |