使用SignalR从控制台向网页发送消息

时间:2015-12-01 23:36:58

标签: c# model-view-controller signalr

我正在尝试使用SignalR从控制台应用程序向MVC应用程序发送消息, 以下是代码:

static void Main(string[] args)
    {

        string url = "http://localhost:8080";
        string line=null;
        MyHub obj = new MyHub();

        using (WebApp.Start(url))
        {
            Console.WriteLine("Server running on {0}", url);
            Console.ReadLine();

            Console.WriteLine("Enter your message:");
            line = Console.ReadLine();
            obj.Send(line);

        }

    }
}
class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseCors(CorsOptions.AllowAll);
        app.MapSignalR();
    }
}
public class MyHub : Hub
{
    public void Send(string message)
    {
        Clients.All.addMessage(message);
    }
}

以下是iam试图在网站上收到消息的方式:

<script type="text/javascript">
    $(function () {
        //Set the hubs URL for the connection
        $.connection.hub.url = "http://localhost:8080/signalr";

        // Declare a proxy to reference the hub.
        var chat = $.connection.myHub;

        // Create a function that the hub can call to broadcast messages.
        chat.client.addMessage = function (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.
            $('#discussion').append('<li><strong>'
                + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
        };
        // Get the user name and store it to prepend to messages.
        //$('#displayname').val(prompt('Enter your name:', ''));
        // Set initial focus to message input box.
        //$('#message').focus();
        // Start the connection.


    });
</script>

事情是我得到以下例外:

Exception

感觉就像我无法直接实例化Myhub类的对象,关于如何解决这个问题的任何想法,请记住我需要将消息从控制台发送到网页..任何建议???

1 个答案:

答案 0 :(得分:1)

使用SignalR,您不会实例化集线器类,SignalR会这样做,并且它不会两次使用相同的集线器实例。切勿将状态数据存储在集线器类本身中。

SignalR使用集线器上下文来跟踪客户端并允许您与客户端进行交互。您需要先从SignalR库获取此上下文,然后才能发送信息等。IHubContext为您提供在集线器中使用的ClientsGroups成员,允许您执行此操作你将在集线器中做同样的事情。

试试这个:

static void Main(string[] args)
{
    string url = "http://localhost:8080";
    using (WebApp.Start(url))
    {
        Console.WriteLine("Server running on {0}", url);

        // get text to send
        Console.WriteLine("Enter your message:");
        string line = Console.ReadLine();

        // Get hub context 
        IHubContext ctx = GlobalHost.ConnectionManager.GetHubContext<MyHub>();

        // call addMessage on all clients of context
        ctx.Clients.All.addMessage(line);

        // pause to allow clients to receive
        Console.ReadLine();
    }
}