使用SignalR从C#调用JS方法?

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

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

毂:

[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导入标记,它停止了正在运行的页面上的所有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();
点赞