5

既存の Web アプリケーションで SignalR を使用すると問題が発生します。$.connection オブジェクトからハブを取得しようとすると、null が返されるため、「Unable to get property 'client' of undefined or null reference」という javaruntime 例外が発生します。

コードを投稿する前に、いくつかの背景と、すでに試したことを説明したいと思います。 - プロジェクトをローカルで実行すると、すべて正常に動作します。問題が発生するのは、プロジェクトを IIS の場所に展開したときだけです。- ハブ名が正しくキャメル ケースになっていることを確認しました。繰り返しますが、ローカルでは問題なく動作し、プロジェクトを IIS にデプロイした後にのみエラーがスローされます。- すべての JavaScript が正常に読み込まれたことを確認しました。JQuery ライブラリは 1 回だけ参照され、正常にロードされます。signalR javascript と、動的に作成されたシグナル/ハブも同様です。- 新しいプロジェクトを作成し、既存の Web アプリケーションの下で Web アプリとして実行されている新しい Web アプリケーションと同じコードを実行すると、すべて正常に動作します (新しいプロジェクトで同じコードが使用されています)。

誰が問題が何であるかについて何か考えがありますか?

ハブ コード:

Imports Microsoft.AspNet.SignalR

Public Class TestHub
    Inherits Hub

    Public Sub Connect()
        Try
            Clients.Caller.onConnect(Context.ConnectionId)
        Catch ex As Exception
            LogMessage("ERROR Connecting to Hub", 0, 0, "ERROR")
        End Try
    End Sub

End Class

ウェブページコード:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="Scripts/jquery-1.6.4.min.js"></script>
    <!--Reference the SignalR library. -->
    <script src="Scripts/jquery.signalR-1.1.3.js"></script>
    <!--Reference the autogenerated SignalR hub script. -->
    <script src="signalr/hubs"></script>
    <script type="text/javascript">
        $(function () {
            // Declare a proxy to reference the hub. 
            var thub = $.connection.testHub;

            registerClientMethods(thub);

            // Start Hub
            $.connection.hub.start().done(function () {
                registerEvents(thub);
                thub.server.connect();
                alert('connected!');
            });
        });


        function registerClientMethods(thub) {
            thub.client.onConnect = function (id) {
                $('#lblConnectionID').text(id);
            }
        }

        function registerEvents() {

        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="lblConnectionID" runat="server" />
    </div>
    </form>
</body>
</html>

Global.asax コード:

Imports System.Web.Routing
Imports Microsoft.AspNet.SignalR

Public Class Global_asax
  Inherits System.Web.HttpApplication
    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    ' Fires when the application is started
    Try
    ' Register the default hubs route: ~/signalr/hubs
    RouteTable.Routes.MapHubs()
    Catch ex As Exception
    LogMessage("ERROR initializing SignalR: " & ex.Message, 0, 0, "ERROR")
    End Try
End Sub
...

したがって、私のページ SignalRTest.aspx に移動すると、行thub.client.onConnected = ...が javascript エラーをスローします:「未定義または null 参照のプロパティ 'client' を取得できません」

誰がこれを引き起こしているのか知っていますか? ありがとうございました。

[編集] - 動作中の signalr/hubs.js ファイルと動作していないファイルを比較したところ、次の部分が欠落していることがわかりました。

proxies.testHub= this.createHubProxy('testHub'); 
    proxies.testHub.client = { };
    proxies.testHub.server = {
        connect: function () {
            return proxies.transactionHub.invoke.apply(proxies.testHub, $.merge(["Connect"], $.makeArray(arguments)));
         }
    };

これが signalr/hubs.js ファイルに含まれない理由について何か考えはありますか? Global.asax で MapHubs() を呼び出しています...

ありがとう!

[修正] 宛先 Web アプリケーションの Bin フォルダーを削除し、再デプロイしました。何が違うのかはまだわかりません。すべての .DLL は同じです。それは今でも動作します。奇数。

4

1 に答える 1

4

VS 2012 から IIS 7.5 に発行した後、Web アプリケーションを実行するためにデバッグしようとすると、このエラーが発生しました。しばらくして、デプロイ時に jquery スクリプトとシグナル パスを変更しなかったことが問題であることに気付きました。

この問題を解決するには、jquery と signalr のスクリプト タグのパスに仮想ディレクトリ名 (「TestingChat」) を追加する必要がありました。

例えばこれから:

<script src="Scripts/jquery-1.8.2.min.js" ></script>
<script src="/signalr/hubs"></script>

<script src="/TestingChat/Scripts/jquery-1.8.2.min.js" ></script>
<script src="TestingChat/signalr/hubs"></script>
于 2013-11-21T13:04:22.103 に答える