ASP.NET空网站中的SignalR无法使用

问题描述 投票:0回答:2

我是一个非常新的术语SignalR。我试图配置signalR到我的空网站,并添加以下代码。

在App_Code中

  using Microsoft.Owin;
  using Owin;

  [assembly: OwinStartup(typeof(Super.App_Code.Startup))]

  namespace Super.App_Code
  {
     public class Startup
     {
         public static void Configuration(IAppBuilder app)
         {
             app.MapSignalR();

         }
     }
  }

和枢纽类Inside App_Code

namespace Super.App_Code
{
[HubName("toastHub")]
 public class ToastHub : Hub
{
    public void BroadcastToast(string type ,string msg)
    {
        Clients.All.sendToast(type , msg);
    }
}
}

并在Default.aspx中

<head runat="server">
<title></title>
<link rel="stylesheet" href="content/toastr.min.css" />

<script src="Scripts/jquery-1.6.4.js" type="text/javascript"></script>
<script src="Scripts/jquery.signalR-2.4.1.js" type="text/javascript"></script>
<script src="Scripts/toastr.min.js" type="text/javascript"></script>
<script src="signalr/hubs" type="text/javascript"></script>

<script type="text/javascript">

    $(document).ready(function () {

        $("#SuccessLink").click(function () {
            console.log("Success Click");
            $.connection.toastHub.client.broadcastToast('success', 'you have done');
        });

        $("#ErrorLink").click(function () {
            console.log("Error Click");
            $.connection.toastHub.client.broadcastToast("error", "you have not done");
        });

        $.connection.hub.start().done(function () {
            console.log('SignalR connected');
        })
        .fail(function (data) {
            console.log('SignalR failed to connect: ' + data);
        });

        $.connection.toastHub.client.sendToast = function (type, msg) {
            console.log("sendToast Called");
            toastr[type](msg);
        };
    });
 </script>
 </head>
 <body>
 <form id="form1" runat="server">
    <div>
        <a id="SuccessLink" style="color: lightgreen">Success Toast</a><br />
        <a id="ErrorLink" style="color: red">Error Toast</a>
    </div>

  </form>
  </body>
  </html>

但当我运行我的网站时,当我点击其中一个标签时,javascript控制台会显示这样的信息

  SignalR connected
  Default.aspx:20 Success Click
  Default.aspx:21 Uncaught TypeError: $.connection.toastHub.client.broadcastToast is not a function
      at HTMLAnchorElement.<anonymous> (Default.aspx:21)
      at HTMLAnchorElement.handle (jquery-1.6.4.js:3001)
      at HTMLAnchorElement.eventHandle (jquery-1.6.4.js:2635)

我做错了什么,请帮助我任何帮助将是巨大的.我完全新的SignalR。

我是一个完全陌生的SignalR.I am totally new to SignalR.

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

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

                    // Use the actual user-provided callback as the "identity" value for the registration.
                    subscriptionMethod.call(hub, memberKey, makeProxyCallback(hub, memberValue), 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['toastHub'] = this.createHubProxy('toastHub'); 
    proxies['toastHub'].client = { };
    proxies['toastHub'].server = {
    };

    return proxies;
};

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

}(window.jQuery, window));
asp.net signalr signalr-hub
2个回答
0
投票

在我看来,你只需要将客户端对服务器的broadcastToast的调用改变一下。因为该方法在Hub中,所以需要服务器来代替。

$.connect.toastHub.client.broadcast To $.connect.toastHub.server.broadcast。


1
投票

你的SignalR项目有些地方初始化不正确,我想访问一个hubContext应该在你的startup.cs里有一个Dependency Injector。但是用DI做SignalR的上下文注入是一个高级问题。

不过,请尝试这个最小样本,如果对你有用的话。https:/github.combezzadMVC-SignalR-2。

© www.soinside.com 2019 - 2024. All rights reserved.