Startup.cs method app.MapSignalR() not generating hubs in signalR-2.0 - c#

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.

Related

My Hub class is not calling using signal R

I am using signalR in my application.
This the client side code:
<script src="Scripts/jquery-1.6.4.js" type="text/javascript"></script>
<script src="Scripts/jquery.signalR-2.2.0.js" type="text/javascript"></script>
<script src="signalr/hubs" type="text/javascript"></script>
<script type="text/javascript">
var data = $.connection.Hubclass;
alert(data); // data is undefine
</script>
My hub class is as bellow
public class Hubclass :Hub
{
public void getdata(string msg)
{
Clients.All.send(msg);
}
}
I have startup class in Owin as bellow
[assembly: OwinStartup(typeof(Startup1))]
public class Startup1
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
This is the configuration I use in web.config:
<appSettings>
<add key="owin:appStartup" value="Startup1" />
</appSettings>
In the Global.asax class file, I also add this code:
RouteTable.Routes.MapHubs();
When I fire up the application, this is the error I get:
Error CS0619 'SignalRRouteExtensions.MapHubs(RouteCollection)' is
obsolete: 'Use IAppBuilder.MapSignalR in an Owin Startup class. See
http://go.microsoft.com/fwlink/?LinkId=320578 for more details
if i remember correctly client proxy is camel-cased (generated or dynamic) so you should use
$.connection.hubclass
or add to hub class name attribute
[HubName("Hubclass")]
and also you don't need set signalr routes by RouteTable.Routes.MapHubs owin middleware will handle routing for you...
EDIT: maybe you can check whether your generated proxy was download correctly by signlar/hubs request, check your network tab at your browser. If doesn't, there can be problem with OWIN intialization, maybe you have to set namespace or friendly name at appConfig for proper Startup class detection, check startup detection
<add key="owin:appStartup" value="StartupDemo.ProductionStartup" />

SignalR cannot set property '' of undefined

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.

SignalR cannot read property client of undefined

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);
}
}

how to setup a C# winforms application to host SignalR Hubs?

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'

WCF Newbie Question: Calling Methods from JavaScript

Greetings!
I'm new to WCF and I thought it would be similar to ASP.NET web services, but I'm unable to call a method from client-side JavaScript. My web form looks like this:
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Path="~/test.js" />
</Scripts>
<Services>
<asp:ServiceReference Path="~/MyService.svc" />
</Services>
</asp:ScriptManager>
</div>
<button onclick="test()">Click Me</button>
</form>
My service's interface looks like this:
namespace Test
{
[ServiceContract(Namespace = "Test")]
public interface IMyService
{
[OperationContract]
void DoWork();
[OperationContract]
string SayHi();
}
}
And here's its implementation:
namespace Test
{
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MyService : IMyService
{
public void DoWork()
{
}
public string SayHi()
{
return "Hello, World!";
}
}
}
And finally the JavaScript:
function test() {
Test.MyService.SayHi(SayHiSuccess, SayHiError);
}
function SayHiSuccess(result) {
alert(result[0]);
}
function SayHiError(error) {
alert(error.toString());
}
It appears that the service's SayHi() method never executes, although I'm not sure why or how to being troubleshooting. Any suggestions?
You didn't post your web.config contents. What binding are you using? You should probably be using webHttpBinding.
Also, it may help to know your .svc file contents. Although I've never tried it, I understand that you don't have to modify web.config at all if you use WebScriptServiceHostFactory as your service host factory. That's as simple as modifying your .svc file as follows:
<%# ServiceHost Service="MyService"
Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"
%>
If all else fails, here are some resources for you:
Calling WCF Service from Javascript
Create a Simple WCF Web...
Your code looks OK. Should be working by right. You could try adding the WebService and the WebMethod attributes as well.
For debugging a WCF web service I normally use Fiddler to track HTTP calls while running the WCF code with a debugger attached (run in Visual Studio in most cases).

Categories