模拟Stack Overflow平滑投票操作

4
我想知道谷歌翻译(translate.google.com)如何在没有postback的情况下保存用户评价,还有其他地方也有类似的行为(例如Stack Overflow),用户看不到postback(一切都很快和流畅),但是有一些数据库交互,例如在Stack Overflow中对问题/答案或评论进行投票,这是Ajax吗?还是只是JavaScript?这真的很好,我该如何使用VS2010、C#、ASP.NET实现这些类型的操作?谢谢。

1
是的,这就是 AJAX。它基本上是 Javascript 中的一种技术。但我无法帮助您在 C# 中实现它。 - Bart Vangeneugden
1
你是指页面在不刷新的情况下如何更新吗?猜测可能是“ajax长轮询”。基本上,客户端发送请求,但服务器会等待直到有响应才回复,然后客户端发送另一个“长轮询”请求,服务器会一直保持连接。 - CodeClown42
1
“但是这里涉及到一些数据库交互,例如在Stackoverflow中投票问题/回答或评论”这种说法对我来说有些模棱两可,因为它并没有说明“当投票或发表评论时”,而可能包括别人投票或发表评论时的更新。这需要某种形式的轮询或Web Sockets技术。” - CodeClown42
1
@goldilocks:是的,那个可以,但对我来说,问题是关于投票,而不是关于在后台看到投票发生。 - T.J. Crowder
1
@Ali_dotNet: "有没有办法让我的 Web 服务只能从我的 JS 中调用?这样用户就不能调用它了吗?" 不,您必须将来自客户端发送的所有数据视为可疑。它可以通过大约十几种方式欺骗(在浏览器中,在类似于浏览器的工具中,通过中间人代理等)。 - T.J. Crowder
显示剩余11条评论
2个回答

3

概述

本文涉及两个方面:

  • 当您执行需要在服务器上记录的操作时。
  • 当您仅查看内容时,却发现某些信息已更新(例如:投票指示器发生变化,提示“此帖子已被修改,单击加载”,“此问题已关闭,不再接受回答”等)。

当您执行需要在服务器端记录的操作时(例如:投票)

这是JavaScript代码向服务器发送ajax消息。对话的服务器端可以使用您喜欢的任何技术来实现(Web的乐趣之一是客户端和服务器端是解耦的)。具体而言,页面以当时的投票信息加载,当您单击投票按钮时,JavaScript代码立即更新投票显示,并随后向服务器发送ajax请求以记录投票(因此获得即时视觉反馈)。通常,该请求在合理的时间内完成,一切正常。有时处理请求时会出现错误(HTTP错误或逻辑错误,例如服务器拒绝了投票),这时您会看到一个错误消息,代码会还原投票的显示(因为它没有在服务器上注册)。
在Stack Exchange的情况下,他们在JavaScript代码中使用jQuery库。为了让您了解这是多么简单,这里是使用jQuery的直接ajax调用的客户端部分:
$.ajax({
    url:    "/path/to/server/resource",
    method: "POST",
    data:   {action: "voteup"},
    success: function(data) {
        // Do something with the successful response from the server,
        // which can send back data
    },
    error:   function(jqXHR, textStatus, errorThrown) {
        // Do something with the error that occurred
    }
 });

服务器端只需以任何合理的方式响应POST操作。

该示例使用jQuery,但还有许多其他JavaScript库也可以使ajax变得非常简单,例如YUI, Closure, Prototype其他几个。 jQuery目前(远远)是用于基于浏览器的JavaScript任务的最流行的库,但它不是唯一的库。

当您只是查看内容时

我只能从外部说这件事情,但我希望Stack Exchange使用多种“comet”技术(Web套接字、长轮询、隐藏的iframes等)。

我希望网络套接字是首选。例如,如果我使用Chrome打开一个问题并打开网络选项卡,我会看到一个请求到ws://sockets.ny.stackexchange.com/,而ws是与Web套接字相关的RFC6455线路协议涵盖的两种方案之一(另一种是SSL安全版本的wss)。Web套接字的乐趣在于它们正式和稳健地允许客户端和服务器之间的持续双向通信,使服务器可以根据需要向客户端推送数据。
现在网络套接字得到了合理的支持, 但IE9及更早版本明显缺少支持,因此SE可能会回退到在上面链接中提到的旧技术中的一个或多个用于不支持它们的浏览器。

0

对我来说,用 Dapper 替换 Entity Framework 效果非常好。速度显著提升。


他在询问客户端功能,而非数据库细节。 - Dante
2
@Dante,Ali_dotNet知道这是AJAX(他在评论中说了),他想知道为什么它可以如此快(除了他要求实现)。我知道“从数据库到应用程序”只是完整解决方案的一部分。我的答案涉及他问题中的速度部分。 - Roger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接