0
votes

I have/am recently upgraded/upgrading from signalR 0.5.3 to 1.0.x rc2 and I am having problems creating my connection.

The issue is that I am hitting the exception:

TypeError: res is null

connection.appRelativeUrl = res.Url;

My script to create the connection has been stripped right back to the default demo code:

        var connection = $.connection('/signalr');

        connection.start(function () {
            console.log("connection started!");
        });

Still I get the error. When I step into the jquery.signalr.js file, and I hit the connection code:

 var url = connection.url + "/negotiate";
 connection.log("Negotiating with '" + url + "'.");
 $.ajax({
         url: url,
         global: false,
         cache: false,
         type: "GET",
         data: {},
         dataType: connection.ajaxDataType,
         error: function (error) {
              $(connection).triggerHandler(events.onError, [error.responseText]);
              deferred.reject("SignalR: Error during negotiation request: " + error.responseText);
              // Stop the connection if negotiate failed
              connection.stop();
          },
          success: function (res) {
               var keepAliveData = connection.keepAliveData; 
               connection.appRelativeUrl = res.Url;

I'm getting to the last line and the res parameter is null which is bombing out my connection attempt. I have updated all signalR dependencies, changed all hub client side calls to use the additional client/server properties in hubs.

My /signalr/hubs js script is being created and has all the right methods mapping to the server side hub methods I expect to be available. The js file is as follows:

    /*!
    * ASP.NET SignalR JavaScript Library v1.0.0
    * http://signalr.net/
    *
    * Copyright Microsoft Open Technologies, Inc. All rights reserved.
    * Licensed under the Apache 2.0
    * https://github.com/SignalR/SignalR/blob/master/LICENSE.md
    *
    */

   /// <reference path="..\..\SignalR.Client.JS\Scripts\jquery-1.6.4.js" />
   /// <reference path="jquery.signalR.js" />

      (function ($, window) {
       /// <param name="$" type="jQuery" />

   "use strict";

    if (typeof ($.signalR) !== "function") {
        throw new Error("SignalR: SignalR is not loaded. Please ensure jquery.signalR-x.js is referenced before ~/signalr/hubs.");
    }

    var signalR = $.signalR;

    function makeProxyCallback(hub, callback) {
        return function () {
            // Call the client hub method
            callback.apply(hub, $.makeArray(arguments));
        };
    }

    function registerHubProxies(instance, shouldSubscribe) {
        var key, hub, memberKey, memberValue, subscriptionMethod;

        for (key in instance) {
            if (instance.hasOwnProperty(key)) {
                hub = instance[key];

                if (!(hub.hubName)) {
                    // Not a client hub
                    continue;
                }

                if (shouldSubscribe) {
                    // We want to subscribe to the hub events
                    subscriptionMethod = hub.on;
                }
                else {
                    // We want to unsubscribe from the hub events
                    subscriptionMethod = hub.off;
                }

                // Loop through all members on the hub and find client hub functions to subscribe/unsubscribe
                for (memberKey in hub.client) {
                    if (hub.client.hasOwnProperty(memberKey)) {
                        memberValue = hub.client[memberKey];

                        if (!$.isFunction(memberValue)) {
                            // Not a client hub function
                            continue;
                        }

                        subscriptionMethod.call(hub, memberKey, makeProxyCallback(hub, memberValue));
                    }
                }
            }
        }
    }

    $.hubConnection.prototype.createHubProxies = function () {
        var proxies = {};
        this.starting(function () {
            // Register the hub proxies as subscribed
            // (instance, shouldSubscribe)
            registerHubProxies(proxies, true);

            this._registerSubscribedHubs();
        }).disconnected(function () {
            // Unsubscribe all hub proxies when we "disconnect".  This is to ensure that we do not re-add functional call backs.
            // (instance, shouldSubscribe)
            registerHubProxies(proxies, false);
        });

        proxies.chatHub = this.createHubProxy('chatHub'); 
        proxies.chatHub.client = { };
        proxies.chatHub.server = {
            exitChat: function (chatId) {
            /// <summary>Calls the ExitChat method on the server-side ChatHub hub.&#10;Returns a jQuery.Deferred() promise.</summary>
            /// <param name=\"chatId\" type=\"String\">Server side type is System.String</param>
                return proxies.chatHub.invoke.apply(proxies.chatHub, $.merge(["ExitChat"], $.makeArray(arguments)));
             },

            getChat: function (chatId) {
            /// <summary>Calls the GetChat method on the server-side ChatHub hub.&#10;Returns a jQuery.Deferred() promise.</summary>
            /// <param name=\"chatId\" type=\"String\">Server side type is System.String</param>
                return proxies.chatHub.invoke.apply(proxies.chatHub, $.merge(["GetChat"], $.makeArray(arguments)));
             },

            joinChat: function (chatId, inviteeUserIds, groupId) {
            /// <summary>Calls the JoinChat method on the server-side ChatHub hub.&#10;Returns a jQuery.Deferred() promise.</summary>
            /// <param name=\"chatId\" type=\"String\">Server side type is System.String</param>
            /// <param name=\"inviteeUserIds\" type=\"Object\">Server side type is System.String[]</param>
            /// <param name=\"groupId\" type=\"String\">Server side type is System.String</param>
                return proxies.chatHub.invoke.apply(proxies.chatHub, $.merge(["JoinChat"], $.makeArray(arguments)));
             },

            sendChatMessage: function (chatId, messageId, message) {
            /// <summary>Calls the SendChatMessage method on the server-side ChatHub hub.&#10;Returns a jQuery.Deferred() promise.</summary>
            /// <param name=\"chatId\" type=\"String\">Server side type is System.String</param>
            /// <param name=\"messageId\" type=\"String\">Server side type is System.String</param>
            /// <param name=\"message\" type=\"String\">Server side type is System.String</param>
                return proxies.chatHub.invoke.apply(proxies.chatHub, $.merge(["SendChatMessage"], $.makeArray(arguments)));
             },

            typing: function (chatId, isTyping) {
            /// <summary>Calls the Typing method on the server-side ChatHub hub.&#10;Returns a jQuery.Deferred() promise.</summary>
            /// <param name=\"chatId\" type=\"String\">Server side type is System.String</param>
            /// <param name=\"isTyping\" type=\"\">Server side type is System.Boolean</param>
                return proxies.chatHub.invoke.apply(proxies.chatHub, $.merge(["Typing"], $.makeArray(arguments)));
             }
        };

        proxies.debugHub = this.createHubProxy('debugHub'); 
        proxies.debugHub.client = { };
        proxies.debugHub.server = {
            registerWithDebugger: function () {
            /// <summary>Calls the RegisterWithDebugger method on the server-side DebugHub hub.&#10;Returns a jQuery.Deferred() promise.</summary>
                return proxies.debugHub.invoke.apply(proxies.debugHub, $.merge(["RegisterWithDebugger"], $.makeArray(arguments)));
             }
        };

        proxies.groupHub = this.createHubProxy('groupHub'); 
        proxies.groupHub.client = { };
        proxies.groupHub.server = {
            joinGroup: function (userId, groupId) {
            /// <summary>Calls the JoinGroup method on the server-side GroupHub hub.&#10;Returns a jQuery.Deferred() promise.</summary>
            /// <param name=\"userId\" type=\"String\">Server side type is System.String</param>
            /// <param name=\"groupId\" type=\"String\">Server side type is System.String</param>
                return proxies.groupHub.invoke.apply(proxies.groupHub, $.merge(["JoinGroup"], $.makeArray(arguments)));
             },

            joinGroups: function (userId) {
            /// <summary>Calls the JoinGroups method on the server-side GroupHub hub.&#10;Returns a jQuery.Deferred() promise.</summary>
            /// <param name=\"userId\" type=\"String\">Server side type is System.String</param>
                return proxies.groupHub.invoke.apply(proxies.groupHub, $.merge(["JoinGroups"], $.makeArray(arguments)));
             },

            leaveGroup: function (userId, groupId) {
            /// <summary>Calls the LeaveGroup method on the server-side GroupHub hub.&#10;Returns a jQuery.Deferred() promise.</summary>
            /// <param name=\"userId\" type=\"String\">Server side type is System.String</param>
            /// <param name=\"groupId\" type=\"String\">Server side type is System.String</param>
                return proxies.groupHub.invoke.apply(proxies.groupHub, $.merge(["LeaveGroup"], $.makeArray(arguments)));
             }
        };

        proxies.userHub = this.createHubProxy('userHub'); 
        proxies.userHub.client = { };
        proxies.userHub.server = {
            registerUserClient: function (userId) {
            /// <summary>Calls the RegisterUserClient method on the server-side UserHub hub.&#10;Returns a jQuery.Deferred() promise.</summary>
            /// <param name=\"userId\" type=\"String\">Server side type is System.String</param>
                return proxies.userHub.invoke.apply(proxies.userHub, $.merge(["RegisterUserClient"], $.makeArray(arguments)));
             },

            updateUserClientStatus: function (userId, latestHeartbeat, latestInteractivity) {
            /// <summary>Calls the UpdateUserClientStatus method on the server-side UserHub hub.&#10;Returns a jQuery.Deferred() promise.</summary>
            /// <param name=\"userId\" type=\"String\">Server side type is System.String</param>
            /// <param name=\"latestHeartbeat\" type=\"Object\">Server side type is System.DateTime</param>
            /// <param name=\"latestInteractivity\" type=\"Object\">Server side type is System.DateTime</param>
                return proxies.userHub.invoke.apply(proxies.userHub, $.merge(["UpdateUserClientStatus"], $.makeArray(arguments)));
             }
        };

        return proxies;
    };

    signalR.hub = $.hubConnection("/signalr", { useDefaultPath: false });
    $.extend(signalR, signalR.hub.createHubProxies());

   }(window.jQuery, window));

Any ideas?

1
I just tried the same code and it all worked for me. Do you have any custom signalr or route configurations?N. Taylor Mullen
I'm going to confirm this but I think my dev machine environment is completely SNAFUHCdev

1 Answers

0
votes

Turns out there is nothing wrong with the code above. The migration from SignalR 0.5.3 to 1.0.x went without a hitch. The problem was that my Dev environment was quite messed up.

There was one MASSIVE gotcha in our case - that we are also using RavenDB. There is a dependency for both on different versions of NewtonSoft JSON.

If you're in a situation where you are using both of these technologies together, be careful about passing JSON objects formatted in a previous version of NewtonsoftJson from one to the other as the resultant JSON serialized objects are not backward compatible.

You have to map them manually when passing from Raven to SignalR js client.