在我解释之前,让我先描述一下你的方法有什么问题,你如何完成你的任务
当您编写这段代码时,您假设客户端和服务器以某种方式连接并且可以在需要时相互通信。可悲的是,事实并非如此。 HTTP 是一种无状态协议。您可能想知道,无状态协议是什么意思?
假设服务器是 James,他有电话线,但没有来电显示。他每天都会接到数千个来自不同客户的电话,询问一个问题。现在James知识渊博,可以快速回答这些问题,但是一旦他从客户那里打折,他就无法回电(记住没有来电显示,意味着James无法回电客户)。
这一切都好,当您有简短的问题要问但如果您有问题需要詹姆斯考虑答案时,您要么需要在线等待,詹姆斯思考,要么您希望詹姆斯给您回电。
为了在电话上等待,您需要增加 webconfig 中的 ASP.Net executionTimeOut 值。默认值为 110 秒,当您等待答案时,您可以使用以下代码显示加载/进度微调器
<div id="preloader" style="width: 100%; text-align: center;">
<img src="../Images/loading.gif" alt="" style="display: block;" />
</div>
<script language="javascript" type="text/javascript">
function HidePreloader() {
if (document.getElementById('preloader') != null) {
document.getElementById('preloader').style.visibility = 'hidden';
}
}
</script>
只需在按钮/链接点击时调用函数 HidePreloader。
这都是笨拙的多莉,但请记住詹姆斯是个老家伙,他只能同时听 10 个电话。如果那时已经有 10 个人接听了 James,那么他将无法接听第 11 个电话。这不好,我们想要的是詹姆斯给我们回电话的方式。我们想给 James 一个来电显示。遗憾的是,来电显示在 Windows 8 服务器之前将不可用,并且仅对支持 websockets 的客户端(浏览器)可用。
那么我们还能做什么,我们如何解决这个问题,哦等等,如果我们给詹姆斯我们的名字并告诉他怎么办,我会在 5 分钟内回电,看看你是否找到答案。这称为轮询。基本上你要求服务器完成一个长时间运行的任务,服务器会给你令牌。每隔几分钟或几秒钟,你就会问服务器,这是我的令牌,我的任务是否完成。如果任务完成,您将使用新数据填充页面。传统上,这是使用 Javascript 和 Web 服务完成的。你也可以看看这个框架SignalIR,它提供了完成这类事情的方法。
希望这种心智模型能帮助您更好地理解 HTTP 的无状态特性。