实时服务器到客户端通信asp.net c#

时间:2014-02-28 04:33:52

标签: c# asp.net web-applications webforms

你好我正在研究以下问题的一些解决方案,我们将不胜感激。

我的应用程序位于c#asp.net Web表单应用程序中。我需要能够在客户端之间进行实时更新,这是方案:

客户端1正在更新第1页让我们说一个包含文本框和网格视图的页面。用户在文本框中输入一些文本,并在提交时保存在SQL Server数据库中并更新网格视图。同时客户端2查看第1页我需要让服务器在更新数据库时将更新推送到第二个客户端。我正在寻找一个不需要JavaScript的解决方案,可以从服务器推送并在客户端2上调用c#中的代码。

性能是一个问题,因为SQL服务器和高级别用户可能会有很高的使用率。所以我不想从每个客户端轮询数据库。

感谢您的帮助。任何建议都会很棒。

更新:这是我现在的解决方案:

HTML

       $(function() {
                var updater = $.connection.updateHub;
                //Create broadcast function
                updater.client.broadcastMessage = function () {

                    __doPostBack("upNotes", "");

                };

                //Start the connection to the hub
                $.connection.hub.start().done(function() {
                    $(<%= btnNotesSubmit.ClientID %>).click(function () {
                        updater.server.send();
                    });
                });
            });

<asp:UpdatePanel ID="upNotes" runat="server" UpdateMode="Conditional" OnLoad="ReloadNotes">
   <ContentTemplate>
       <asp:GridView ID="gvNotes" runat="server">

等...

OnLoad在C#中调用一个代码隐藏函数,用于检查db的更改,然后重新绑定网格

1 个答案:

答案 0 :(得分:1)

嗯,你可能不太成功。

如果没有Javascript保持打开套接字,则无法将更改实际推送回客户端,尽管网页的连续轮询至少会刷新。使用Javascript,您可以进行持久的AJAX调用(请使用超时和错误处理),并在调用最终成功时更新网页。

每次轮询时,网络没有必要访问数据库。

如果您不希望每次轮询页面时都涉及数据库,您可以通过不同的方法发出挂起的更改信号,或者您可以让数据库更新一些可以在不“点击数据库”的情况下进行检查的内容

例如,如果所有内容都在同一个Web服务器上运行,那么只要您在将数据库更新到共享内存的同时编写时间戳,然后在轮询网页并从中重新加载时检查该共享内存更新时间戳时的数据库。我本身并不推荐这种方法,只是给出一个简单的例子。

我鼓励你放弃关于“没有javascript”的规则,如果你的实时页面对客户很有价值,他们可以将你的服务列入白名单以允许javascript。并且不断地对整个网页进行轮询比对接疙瘩更加丑陋。