webnoob
webnoob

Reputation: 15924

SignalR message not working when sending from server side to client

This is my HTML:

<script type="text/javascript">
    $(function () {
        // Declare a proxy to reference the hub.
        var chat = $.connection.khaosHub;

        // Create a function that the hub can call to broadcast messages.
        chat.client.broadcastMessage = function (message) {
            // Html encode display name and message.
            var encodedMsg = $('<div />').text(message).html(); 
            // Add the message to the page.
            $('#discussion').append('<li>' + encodedMsg + '</li>');
        };

        // Start the connection.
        $.connection.hub.start().done(function () {
            $('#sendmessage').click(function () {
                console.log("sending");
                // Call the Send method on the hub.
                chat.server.send("something");
                // Clear text box and reset focus for next comment.
                $('#message').val('').focus();
            });
        });
    });
</script>

My Hub:

public class KhaosHub : Hub
{
    public void Send(string message)
    {
        Clients.All.broadcastMessage(message);
    }
}

When I click #sendmessage my Send method in KhaosHub is triggered which I have verified using a breakpoint and my message does get sent to the div via broadcastMessage.

Note: I've not included my call to app.MapSignalR in the example above as I know it's working from the client side.

The issue I have is when I call broadcastMessage from some back end code it doesn't work. I am calling it via:

var context = GlobalHost.ConnectionManager.GetHubContext<KhaosHub>();
context.Clients.All.broadcastMessage("some message");

When I debug the Clients.All property, I can't see any clients (I don't know if I should be able to but thought I'd add that information.

Any ideas?

EDIT: This is my startup class for the hub:

[assembly: OwinStartup(typeof (Startup))]

namespace CC.Web
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}

Upvotes: 1

Views: 3421

Answers (1)

Jorrit Reedijk
Jorrit Reedijk

Reputation: 608

Thanks for the question. Following up on the comments I have tracked my own problem down also to not getting the correct hubcontext from the GlobalHost.ConnectionManager.

To solve this I specifically set a DependencyResolver on the GlobalHost and passing this Resolver to the HubConfiguration used to MapSignalR.

In code that is:

Microsoft.AspNet.SignalR.GlobalHost.DependencyResolver = 
    New Microsoft.AspNet.SignalR.DefaultDependencyResolver

app.MapSignalR(
    New Microsoft.AspNet.SignalR.HubConfiguration With
    {.Resolver = Microsoft.AspNet.SignalR.GlobalHost.DependencyResolver})

You may want to convert this VB.Net code to C#.

Upvotes: 1

Related Questions