SignalR owin启动不会受到影响。获取“对象不支持属性或方法”javascript错误

时间:2014-01-13 15:23:49

标签: javascript jquery signalr signalr-hub owin

在过去的几个小时里,我一直在努力工作。我有一个使用SignalR的聊天应用程序,但在运行它时收到javascript错误“对象不支持属性或方法”。我正在使用IIS来托管该网站。 我猜javascript错误是因为启动没有被解雇。

请帮忙。

enter image description here

经过一段时间后,我发现owin创业公司没有受到重创。

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

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

    }
}

我的金块安装是

  <?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>

这是我的页面

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

        });

和我的代码

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

}

2 个答案:

答案 0 :(得分:4)

从SignalR 1.0开始,客户端和服务器方法只能分别通过客户端和服务器命名空间访问。 State也有它自己的命名空间。

这一更改是为了避免客户端和服务器方法之间的冲突。您的JS代码将更改为如下所示:

    $(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();  

    });

答案 1 :(得分:1)

尝试使用

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

如果不起作用,请尝试不使用局部变量:

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

一些资源: http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/tutorial-getting-started-with-signalr-20