【问题标题】:Invoke JS method from C# using SignalR?使用 SignalR 从 C# 调用 JS 方法?
【发布时间】:2012-10-01 07:17:20
【问题描述】:

我知道有很多关于 SignalR 的示例,但我似乎无法让它工作,我希望你们中的一个人能够(完整地)展示 WebPage(线程循环所以我们可以看到它一遍又一遍地发生)可以在页面上调用 JS 方法并更改文本标签或创建弹出窗口,或者只是为了让我们看到方法执行?

我会给你我的代码,也许你可以指出错误,但是任何基本的 Server->Client 调用示例都没有客户端首先发出请求,这将是惊人的!

枢纽:

[HubName("chat")]
public class Chat : Hub
{
    public void Send(string message)
    {
        // Call the addMessage method on all clients?
        Clients.addMessage(message);
    }
}

调用(线程)方法:

private void DoIt()
{
    int i = 0;
    while (true)
    {
        var hubContext = GlobalHost.ConnectionManager.GetHubContext<Chat>();
        hubContext.Clients.addMessage("Doing it... " + i);
        i++;
        Thread.Sleep(500);
    }
}

JS:

$(function () {
    // Proxy created on the fly
    var chat = $.connection.chat;

    // Declare a function on the chat hub so the server can invoke it
    chat.addMessage = function (message) {
        confirm("Are you having fun?");
        confirm(message);
    };

    // Start the connection
    $.connection.hub.start();        
});

【问题讨论】:

  • 你能在没有线程的情况下让它工作吗?
  • 不,它只是从不执行 JS。我什至设置了 WCF 服务并从带有文本的 Winforms 应用程序调用该服务,然后让该服务调用 JS 方法,但仍然无法正常工作。 Chrome 控制台中也没有错误...
  • 嗯...粗略检查后看起来还不错。您是否看到网络面板中实际建立了连接?如果链接 .done(function () { alert("Connected!"); }); 会发生什么从 start() 返回的承诺?它会火吗?如果您在测试页面中放置一个实际从网页本身调用 chat.send() 的文本框会怎样……您看到该消息了吗?
  • 你能设置一个简单的回显服务吗?您使用的是什么 IIS? Windows 7 Home 上的 IIS 7 存在连接并发问题。
  • @Allov - 我在 Windows 7 上使用 IIS 7。我应该做什么/改变什么?

标签: javascript c# asp.net signalr dom-events


【解决方案1】:

我遇到的问题是一个自关闭的 JS 导入标签,它停止了页面上正在运行的所有 JS...

对于遇到相同问题的其他人,这是我在服务器将数据推送到所有客户端而无需客户端提示的工作示例:

Javascript:

$(function () {
    // Proxy created on the fly
    var chat = $.connection.chat;

    // Declare a function so the hub can invoke it
    chat.addMessage = function (message) {
        document.getElementById('lblQuestion').innerHTML = message;
    };

    // Start the connection
    $.connection.hub.start();
});

HTML:

<h2 id="lblQuestion" runat="server">Please wait for a question...</h2>

枢纽:

[HubName("chat")]
public class Chat : Hub
{
    public void Send(string message)
    {
        // Call the addMessage method on all clients
        Clients.addMessage(message);
    }

    public void Broadcast(string message)
    {
        IHubContext context = GlobalHost.ConnectionManager.GetHubContext<Chat>();
        context.Clients.addMessage(message);
    }
}

致电客户:

private void DoIt()
{
    int i = 0;
    while (true)
    {
        var hubContext = GlobalHost.ConnectionManager.GetHubContext<Chat>();
        hubContext.Clients.addMessage("Doing it... " + i);
        i++;
        Thread.Sleep(500);
    }
}

对 DoIt() 的线程调用:

    var thread = new Thread(new ThreadStart(DoIt));

    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();

【讨论】:

    猜你喜欢
    • 2012-12-13
    • 2013-06-14
    • 2014-06-06
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    相关资源
    最近更新 更多