SignalR owin startup doesn't get hit. get "Object doesn't support property or method " javascript error

StackOverflow https://stackoverflow.com/questions/21094929

Pergunta

For the last many hours, I've been banging my head to make this work. I have a chat application using SignalR but am getting the javascript error "Object doesn't support property or method " while running it. I am using IIS to host the site. I am guessing the javascript error is because the startup is not getting fired.

Please help.

enter image description here

after some time I found that owin startup is not getting hit.

    [assembly: OwinStartup( typeof( SignalrSimpleChat.Startup ) )]
    namespace SignalrSimpleChat

{
    public class Startup
    {
        public void Configuration( IAppBuilder app )
        {
            app.MapSignalR( ); // not getting hit!!!!
        }

    }
}

my nugget installs are

  <?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="jQuery" version="2.0.3" targetFramework="net45" />
  <package id="json2" version="1.0.2" targetFramework="net45" />
  <package id="Microsoft.AspNet.SignalR" version="2.0.1" targetFramework="net45" />
  <package id="Microsoft.AspNet.SignalR.Core" version="2.0.1" targetFramework="net45" />
  <package id="Microsoft.AspNet.SignalR.JS" version="2.0.1" targetFramework="net40" />
  <package id="Microsoft.AspNet.SignalR.Owin" version="1.2.0" targetFramework="net45" />
  <package id="Microsoft.AspNet.SignalR.SystemWeb" version="2.0.1" targetFramework="net45" />
  <package id="Microsoft.Owin" version="2.1.0-rc1" targetFramework="net45" />
  <package id="Microsoft.Owin.Host.SystemWeb" version="2.1.0-rc1" targetFramework="net45" />
  <package id="Microsoft.Owin.Security" version="2.1.0-rc1" targetFramework="net45" />
  <package id="Newtonsoft.Json" version="5.0.8" targetFramework="net45" />
  <package id="Owin" version="1.0" targetFramework="net45" />
</packages>

here is my page

    <head>
    <title>Index</title>

    <script src="../../Scripts/jquery-2.0.3.js"></script>
    <script src="../../Scripts/jquery.signalR-2.0.1.js"></script>
    <script src="../../Scripts/json2.js"></script>
   <script src="@Url.Content("~/signalr/hubs")"></script> 

</head>
<body>
    <div>
        <input type="text" disabled id="userName" />
        <input type="text" disabled id="groupName" />

        <input type="text" id="msg" />
        <input type="button" id="broadcast" value="broadcast" />
        <input type="button" id="groupcast" value="groupcast" />
        <ul id="messages">
        </ul>
    </div>
    <script type="text/javascript">
        $(function () {

            var chat = $.connection.chat;

            $('#userName').val(prompt('Enter your name:', ''));
            $('#groupName').val(prompt('Enter your groupName:', ''));

            chat.userName = $('#userName').val();
            chat.groupName = $('#groupName').val();

            chat.addMessage = function (userName, groupName, message) {
                $('#messages').append('<li><b>' + groupName + "." + userName + ":</b>" + message + '</li>');
                $('#msg').val('');
            };

            $("#broadcast").click(function () {
                chat.sendAll(chat.userName, chat.groupName, $('#msg').val());
            });

            $("#groupcast").click(function () {
                chat.sendGroup(chat.userName, chat.groupName, $('#msg').val());
            });

            $.connection.hub.start().done(function () {
                chat.join(chat.groupName);     //throws exception!!!!!!!!!
            });

            $.connection.hub.start();  

        });

and my code behind

namespace SignalrSimpleChat.Models.Helpers
{
    public class Chat : Hub
    {
        public void SendAll( string userName, string groupName, string message )
        {
            Clients.All.addMessage( userName, groupName, message );
        }

        public void SendGroup( string userName, string groupName, string message )
        {
            Clients.Group( groupName ).addMessage( userName, groupName, message );
        }

        public void Join( string groupName )
        {
            Groups.Add( Context.ConnectionId, groupName );
        }
    }

}
Foi útil?

Solução

Starting in SignalR 1.0, client and server methods can only be accessed through the client and server namespaces respectively. State also got it's own namespace.

This change was made to avoid collisions between client and server methods. Your JS code would change to look like this:

    $(function () {

        var chat = $.connection.chat;

        $('#userName').val(prompt('Enter your name:', ''));
        $('#groupName').val(prompt('Enter your groupName:', ''));

        chat.state.userName = $('#userName').val();
        chat.state.groupName = $('#groupName').val();

        chat.client.addMessage = function (userName, groupName, message) {
            $('#messages').append('<li><b>' + groupName + "." + userName + ":</b>" + message + '</li>');
            $('#msg').val('');
        };

        $("#broadcast").click(function () {
            chat.server.sendAll(chat.userName, chat.groupName, $('#msg').val());
        });

        $("#groupcast").click(function () {
            chat.server.sendGroup(chat.userName, chat.groupName, $('#msg').val());
        });

        $.connection.hub.start().done(function () {
            chat.server.join(chat.groupName);     //should no longer throw exception!!!!!!!!!
        });

        $.connection.hub.start();  

    });

Outras dicas

Try using

$.connection.hub.start().done(function () {
    chat.server.join('test');
});

If doesnt work, try without local variable:

$.connection.hub.start().done(function () {
    $.connection.chat.server.join('test');
});

Some resources: http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-getting-started-with-signalr-20

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top