I'm working on an app using SignalR 2 and am running into problems mapping SignalR through the .MapOwinRoute() extension method for the ASP.net 4 RouteTable.Routes. Like:
RouteTable.Routes.MapOwinRoute("signalr.hubs", "signalr/hubs", a => a.MapSignalR());
also added to Web.Config:
<appSettings>
<add key="owin:AutomaticAppStartup" value="false" />
</appSettings
It maps up. Navigating to /signalr/hubs gives me the hubs proxies, but when I connect with my code:
$(function () {
var orderProcessing = $.connection.orderProcessing;
$.connection.hub.start().done(function () {
orderProcessing.server.doStuff();
});
});
The route /signalr/negotiate returns a 404.
Everything works fine when I do it like this:
[assembly: OwinStartup(typeof(Web.Startup))]
namespace Web
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
}
The problem is that using the OwinStartup is not an option for me, as I need to configure SignalR with my own dependency resolver linking it to the general IOC container I use and it is not ready at the point of OwinStartup. I also need to configure the JSON serializer with custom options that also gets configured at a later stage.
Can't quite figure out what I'm missing here.
You don't want to map a route to want to map a prefix (path). Also, you're using the wrong url and wrong IAppBuilder overload.
RouteTable.Routes.MapOwinPath("/signalr", app => app.RunSignalR());
The above logic takes any path that starts with SignalR and passes it to the SignalR middleware.
I'm getting 404 not found error since browser is unable to find /signalr/hubs. I'm using signalR-2.0.0-rc1 in a normal web application (not mvc). Following is the the related web.config settings
<appSettings>
<add key="owin:AppStartup" value="SignalRHubServer.Startup, SignalRHubServer" />
</appSettings>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
</modules>
</system.webServer>
Client code (/signalr/hubs used both ways):
<head>
<title>SignalR Echo</title>
<script type="text/javascript" src="Scripts/jquery-1.6.4.min.js"></script>
<script type="text/javascript" src="Scripts/jquery.signalR-2.0.0-rc1.min.js"></script>
<script type="text/javascript" src="/signalr/hubs"></script>
<!--<script type="text/javascript" src='<%= ResolveClientUrl("signalr/hubs") %>'></script>-->
</head>
Startup.cs is as below:
namespace SignalRHubServer
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
}
When i debug, the breakpoint at app.MapSignaR() does get hit, but still i get the same 404 error. Following is a hub declaration
namespace SignalRHubServer
{
public class MyChatHub : Hub
{
public override Task OnConnected()
{
return base.OnConnected();
}
}
}
I migrated the application from SignalR-1.1.3 and have removed the MapHubs() call from global.asax.cs. I have also uninstalled the related SignalR nuget packages. However, with SignalR-1.1.3 it used to work fine.
Can anyone suggest what i might be doing wrong?
To get this working, i had to revert to SignalR-1.1.3. I couldn't get it to work with the SignalR-2.0-rc1 beta release.
However with SignalR-2.0, stable release in nuget on Oct/17/2013, everything is working fine.
I'm trying to set SignalR in my MVC4 app.
The problem is - even though when I browse to path /signalr/hubs I do see code (and fiddler shows 200OK for /signalr/hubs), it does not seem to contain any reference to my hub and client side code also doesn't see the hub and methods.
I get these errors when starting debugging (IIS Express, VS Express 2012):
Application_Start in Global.asax contains:
//RouteTable.Routes.MapHubs("/signalr", new HubConfiguration());
RouteTable.Routes.MapHubs();
RouteConfig.RegisterRoutes(RouteTable.Routes);
(I assume this generates the /signalr/hubs, this seems to work but nothing links to my actual hub. As can be seen I tried both options).
In my project I got folder "Hubs" in root with MessageHub.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
namespace Prj.Hubs
{
[HubName("messagehub")]
public class MessageHub : Hub
{
public void MessageAll(string message)
{
Clients.All.writeMessage(message);
}
public void MessageOthers(string message)
{
Clients.Others.writeMessage(message);
}
public void MessageSingle(string message)
{
}
}
}
In my _Layout.cshtml I have just before the closing tag:
<script type="text/javascript" src="~/Scripts/jquery-1.9.1.js"></script>
<script type="text/javascript" src="~/Scripts/jquery.signalR-1.1.2.js"></script>
<script src="/signalr/hubs" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
// create proxy on the fly
var proxy = $.connection.messagehub; // this connects to our 'messageHub' Hub as above
// for SignalR to call the client side function we need to declare it with the Hub
proxy.messageAll = function (message) {
$('#messages').append('<li>' + message + ''); // when the Hub calls this function it appends a new li item with the text
};
// declare function to be called when button is clicked
$("#broadcast").click(function () {
// calls method on Hub and pass through text from textbox
proxy.messageAll($("#message").val());
});
// Start the connection
$.connection.hub.start();
});
</script>
(side note - SignalR didn't like at all the #Scripts.Render("~/bundles/jquery"), but a direct jquery script include seems to work).
So why doesn't it recognize "messagehub" exactly?
I solved this - my solution contains multiple projects, and although I had uninstalled SignalR, in some of these projects in the bin/Debug folder there were still traces of an older SignalR version that I tried months ago.
At runtime, SignalR was trying to connect some old dll's with the new references. So if you have this error then
uninstall SignalR
do a search for "SignalR" in your entire solution folder and delete everything
reinstall SignalR from Nuget Package Manager.
I'm trying to add SignalR to my project (ASPNET MVC 4). But I can't make it work.
In the below image you can see the error I'm receiving.
I've read a lot of stackoverflow posts but none of them is resolving my issue.
This is what I did so far:
1) Ran Install-Package Microsoft.AspNet.SignalR -Pre
2) Added RouteTable.Routes.MapHubs(); in Global.asax.cs Application_Start()
3) If I go to http://localhost:9096/Gdp.IServer.Web/signalr/hubs I can see the file content
4) Added <modules runAllManagedModulesForAllRequests="true"/> to Web.Config
5) Created folder Hubs in the root of the MVC application
6) Moved jquery and signalR scripts to /Scripts/lib folder (I'm not using jquery 1.6.4, I'm using the latest)
This is my Index.cshtml
<h2>List of Messages</h2>
<div class="container">
<input type="text" id="message" />
<input type="button" id="sendmessage" value="Send" />
<input type="hidden" id="displayname" />
<ul id="discussion">
</ul>
</div>
#section pageScripts
{
<!--Reference the SignalR library. -->
<script src="#Url.Content("~/Scripts/jquery.signalR-1.0.0-rc1.min.js")" type="text/javascript"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script type="text/javascript" src="~/signalr/hubs"></script>
<script src="#Url.Content("~/Scripts/map.js")" type="text/javascript"></script>
}
This is my IServerHub.cs file (located inside Hubs folder)
namespace Gdp.IServer.Ui.Web.Hubs
{
using Microsoft.AspNet.SignalR.Hubs;
[HubName("iServerHub")]
public class IServerHub : Hub
{
public void Send(string name, string message)
{
Clients.All.broadcastMessage(name, message);
}
}
}
And this is map.js
$(function () {
// Declare a proxy to reference the hub.
var clientServerHub = $.connection.iServerHub;
// Create a function that the hub can call to broadcast messages.
clientServerHub.client.broadcastMessage = function (name, message) {
$('#discussion').append('<li><strong>' + name + '</strong>: ' + message + '</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.
$.connection.hub.start().done(function () {
$('#sendmessage').click(function () {
// Html encode display name and message.
var encodedName = $('<div />').text($('#displayname').val()).html();
var encodedMsg = $('<div />').text($('#message').val()).html();
// Call the Send method on the hub.
clientServerHub.server.send(encodedName, encodedMsg);
// Clear text box and reset focus for next comment.
$('#message').val('').focus();
});
});
});
The DLL's I see references for SignalR are:
Microsoft.AspNet.SignalR.Core
Microsoft.AspNet.SignalR.Owin
Microsoft.AspNet.SignalR.SystemWeb
Any ideas how to get it work?
Should I make any change because the scripts are in /Script/lib folder?
NOTE
I'm following the instruction found here on how to set up Windsor Castle to make it work with SignalR, and again, seems that the proxy cannot be created and I'm getting the same error:
Cannot read property client of undefined
meaning that the proxy to the hub was not created
This is how I have it in the server
public class IncidentServerHub : Hub
and like this in the client
var clientServerHub = $.connection.incidentServerHub;
Again, I can see the dynamically created file here:
/GdpSoftware.Server.Web/signalr/hubs
So, why is the proxy not created?
I fixed that problem by changing my js code from:
var myHub = $.connection.SentimentsHub;
to
var myHub = $.connection.sentimentsHub;
So if you have some hub with class name TestHub you must use testHub(first letter is lowercase) name in js
For those who tried to add the generated proxy file path in the bundle.
Do not include the "~/signalr/hubs" in your BundleConfig.cs.
You can have the JQuery.SignalR in the bundle:
bundles.Add(new ScriptBundle("~/bundles/signalr").Include(
"~/Scripts/jquery.signalR-{version}.js"));
But you will need to add "/signalr/hubs" it in your view:
#section Scripts {
#Scripts.Render("~/bundles/signalr")
#Scripts.Render("/signalr/hubs")
}
I hope this helps.
I had the same error message and resolved the issue by fixing a typo I had in the [HubName] attribute on the hub class - it was not exactly matching the property in the client-side javascript.
C# hub class:
[HubName("gameHub")]
public class GameHub : Hub
{
client-side javascript:
var foo = $.connection.gameHub;
"gameHub" must be the same.
hth
For ASP.Net MVC folks:
Check your _Layout.cshtml: If you are calling the jquery bundle after the #RenderBody(), you will get this error.
Resoultion: Just move the #Scripts.Render("~/bundles/jquery") to the head section or write all signalr scripts in the scripts "section"
Your hub classes must be defined as public. For example:
class ChatHub : Hub
should actually be
public class ChatHub : Hub
Ok, I've found the issue, one thing I needed to do was:
These two references were missing:
Microsoft.AspNet.SignalR.Hosting.AspNet
Microsoft.AspNet.SignalR.Hosting.Common
Now, I included them getting nuget package: WebApiDoodle.SignalR which uses those two.
My question is why those Dlls weren't added one I installed the Nuget Package:
Microsoft.AspNet.SignalR -Pre?
Bug?
Then I had this in my global.asax.cs
using SignalR;
so
RouteTable.Routes.MapHubs();
was using that one, I needed to remove that using and use this one:
using Microsoft.AspNet.SignalR;
So the MapHubs use that one, and started to work.
Hope this helps others.
Guillermo.
You should put SignalR and jQuery scripts, in correct order :
<script src="/Scripts/jquery-1.6.4.min.js" ></script>
<script src="/Scripts/jquery.signalR-1.1.4.js"></script>
<script src="/signalr/hubs"></script>
In my case, I lost Microsoft.Owin.Host.SystemWeb.dll & Microsoft.Owin.Security.dll in my project. After adding References to them, that error was solved. it's working now.
Make sure you add
app.MapSignalR();
inside startup.cs and Configuration method,
like this:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
For Asp.net Core
Add
services.AddSignalR();
in ConfigureServices methode in your startup.cs
And add
app.UseSignalR(routes =>
{
routes.MapHub<ChatHub>("/chatHub");
});
in Configure methode in your startup.cs
Making the Hub class "public" solved it for me.
Most probably, could be the wrong name given in the class and reference in JavaScript is wrong.
var chat = $.connection.chatHub; //did not work
var chat = $.connection.myHub; // this worked
This is my class
public class MyHub : Hub
{
public void Send(string name, string message)
{
Clients.All.addNewMessageToPage(name, message);
}
}
I have read through the SignalR docs and watched a few of the videos, however I can not get SignalR to host within a winforms application.
I have tried using source code off the SignalR wiki: https://github.com/SignalR/SignalR/wiki/Self-host
If you look at the "Full Sample - Hubs", what is the "server" variable? I do not understand how this works or how to convert it to C#. According to the wiki "The default SelfHost implementation is built on HttpListener and can be hosted in any kind of application (Console, Windows Service etc). "
I would like to host SignalR in C# and consume it in asp.net. Could anyone please shed some light on this for me?
The sample in the Wiki works fine.
Please install the SignalR.Hosting.Self package using NuGet (Package Manager Console)
Install-Package SignalR.Hosting.Self
The Server lives in the SignalR.Hosting.Self namespace.
Sample
Console Application
using System;
namespace MyConsoleApplication
{
static class Program
{
static void Main(string[] args)
{
string url = "http://localhost:8081/";
var server = new SignalR.Hosting.Self.Server(url);
// Map the default hub url (/signalr)
server.MapHubs();
// Start the server
server.Start();
Console.WriteLine("Server running on {0}", url);
// Keep going until somebody hits 'x'
while (true)
{
ConsoleKeyInfo ki = Console.ReadKey(true);
if (ki.Key == ConsoleKey.X)
{
break;
}
}
}
public class MyHub : SignalR.Hubs.Hub
{
public void Send(string message)
{
Clients.addMessage(message);
}
}
}
}
Asp.NET / Javascript
<script type="text/javascript" src="Scripts/jquery-1.7.2.js"></script>
<script src="/Scripts/jquery.signalR.js" type="text/javascript"></script>
<script src="http://localhost:8081/signalr"></script>
<script type="text/javascript">
$(function () {
// create signalr hub connection
myHub= $.connection.myHub;
// start hub connection and call the send method
$.connection.hub.start(function () {
myHub.Send('Hello');
});
});
</script>
Please leave a comment if you have additional answers
In order to make this to work for C# and ASP.NET I had to use "Cross Domain".
In the JavaScript I used:
<script type="text/javascript" src='http://localhost:8081/signalr/hubs'></script>
and added:
$.connection.hub.url = 'http://localhost:8081/signalr'