【问题标题】:Push messages from code behind to client using SignalR使用 SignalR 将消息从后面的代码推送到客户端
【发布时间】:2014-06-13 21:38:00
【问题描述】:

我正在从 Excel 电子表格中导入记录。我想用每条记录的进度更新客户端屏幕。我被告知 SignalR 是前进的方向。

我从 ChatHub 示例开始,并将其简化了一点。

编辑... broadcastMessage 函数似乎正在运行,但行为异常。这是正在发生的事情的简短视频:https://www.youtube.com/watch?v=wRqiyaQ2hD0

ASPX 页面

<form id="form2" runat="server">

    <ul id="progressReport"></ul>

    <asp:Button Text="Push message" ID="btn" OnClick="btn_Click" runat="server" />

    <!--Script references. -->
    <!--Reference the jQuery library. -->
    <script src="Scripts/jquery-1.8.2.min.js"></script>
    <!--Reference the SignalR library. -->
    <script src="Scripts/jquery.signalR-2.0.3.min.js"></script>
    <!--Reference the autogenerated SignalR hub script. -->
    <script src="signalr/hubs"></script>

    <!--Add script to update the page and send messages.-->
    <script type="text/javascript">
        $(function () {
            // Declare a proxy to reference the hub. 
            var chat = $.connection.chatHub;
            // Create a function that the hub can call to broadcast messages.
            chat.client.broadcastMessage = function (name, message) {
                // Html encode display name and message. 
                var encodedName = $('<div />').text(name).html();
                var encodedMsg = $('<div />').text(message).html();
                // Add the message to the page. 
                $('#progressReport').append('<li><strong>' + encodedName
                    + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
            };

            // Start the connection.
            $.connection.hub.start().done(function () {
                chat.server.send($('#displayname').val(), $('#message').val());
            });
        });
    </script>
</form>

ASPX.CS

using SignalRChat;
using System;

namespace SignalR_Test
{
    public partial class form2 : System.Web.UI.Page
    {
        protected void btn_Click(object sender, EventArgs e)
        {
            ChatHub ch = new ChatHub();
            for ( int i = 0; i <= 10; i++)
            {
                ch.Send("Code Behind", i +" has been imported");
            }
        }
    }
}

ChatHub.CS

using Microsoft.AspNet.SignalR;
namespace SignalRChat
{
    public class ChatHub : Hub
    {
        public void Send(string name, string message)
        {
            var context = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
            // Call the broadcastMessage method to update clients.
            context.Clients.All.broadcastMessage(name, message);
        }
    }
}

【问题讨论】:

    标签: c# asp.net signalr


    【解决方案1】:

    尝试将此添加到您的 aspx 页面并检查它是否在 javascript 控制台中记录调用:

    $.connection.hub.logging = true;
    $.connection.hub.start();
    

    您的课程名为ChatHub,您正在客户端执行connection.chatHub(注意小写c 与大写)。尝试将HubName 属性添加到您的Hub 类:

    [HubName("chatHub")]
    public class ChatHub : Hub
    

    另外,请尝试将 ~/ 添加到您的脚本 src:

    <script src="~/signalr/hubs"></script>
    

    【讨论】:

    • 感谢您的帮助。控制台没有报告任何错误 - 最后一条消息是:SignalR: Invoked chathub.Send... 我发现使用 2 个浏览器时发生了一些意想不到的事情。我认为这与我从 Chat 演示开始的事实有关。 (视频在这里:youtu.be/8pg5jV-nxMQ?hd=1
    • 在该位置添加 [HubName("chatHub")] 会产生 2 个错误:找不到类型或命名空间名称“HubNameAttribute” 找不到类型或命名空间名称“HubName”跨度>
    • 将此添加到您的使用语句using Microsoft.AspNet.SignalR.Hubs;
    • @wotney 我认为您的视频因重复而被删除。我看不到。
    • 真的感谢您的帮助!...我已经更新了视频的链接
    【解决方案2】:

    您是否缺少必需的Startup 课程?参见示例here

    JS 脚本版本(jquery.signalR-2.0.3.min.js、jquery-1.8.2.min.js)是否与您在“脚本”目录中的脚本匹配?

    【讨论】:

    • 抱歉,Startup 类已存在。我还没调整,所以忘记提了!
    • 脚本版本(html 与脚本目录)怎么样?
    • 从我所见,脚本都被正确引用了。我用视频链接编辑了我的问题,以显示正在发生的事情。
    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 2012-10-13
    • 2015-03-17
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    相关资源
    最近更新 更多