【问题标题】:Self hosted SignalR method not called未调用自托管 SignalR 方法
【发布时间】:2014-08-12 14:41:34
【问题描述】:

我是 SignalR 的新手,在自托管场景中使用 SignalR 集线器有点困难。 目前(仅用于测试)我有最简单的集线器:

public class NotificationsHub : Hub
    {
        public void Hello(string name)
        {
            Clients.All.hello("Hello " + name);
        }        
    }

此集线器类位于 Windows 服务应用程序中引用的类库项目中。我已将所有 nuget 包添加到 Windows 服务应用程序并添加了 OWIN Startup 类,如下所示:

public class Startup
    {
        public void Configuration(IAppBuilder app)
        {            
            AppDomain.CurrentDomain.Load(typeof(NotificationsHub).Assembly.FullName); // as selfhosting doesn't scan referenced libraries for Hubs
            app.Map("/signalr", map => {
                map.UseCors(CorsOptions.AllowAll);
                var hubConfig = new HubConfiguration { 
                    EnableDetailedErrors = true,
                    EnableJSONP = true
                };
                map.RunSignalR(hubConfig);
            });
        }
    }

在 Windows 服务 OnStart 方法中,我使用以下方式托管 signalR:

SignalR = WebApp.Start<Startup>("http://*:9191/");

在应该与 SignalR 交互的 ASP.NET MVC 应用程序中,我有以下代码:

<script src="Scripts/jquery.signalR-2.1.1.min.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="http://localhost:9191/signalr/hubs"></script>
<script type="text/javascript">
        $(function () {
            $.connection.hub.url = "http://localhost:9191/signalr";
            var notif = $.connection.notificationsHub;

            notif.client.hello = function (msg)
            {
                alert(msg);
            }

            $.connection.hub.start().done(function () {
                $("#sayHello").click(function () {
                    notif.server.hello($("#myName").val());
                });
            });
        });
    </script>

问题是这在我的正确设置中不起作用......在浏览器控制台中我没有错误,~/signalr/hubs js 看起来很好...... 如果我进行或多或少相同的配置,但将 SignalR 托管在 ASP.NET MVC 应用程序中,一切都会按预期工作。

更新:按照@halter73 的建议为集线器启用客户端日志记录,我收到以下错误消息,但我仍然无法修复:

SignalR:notificationshub.Hello 未能执行。错误:方法不是 找到:'Microsoft.AspNet.SignalR.Hubs.IHubCallerConnectionContext Microsoft.AspNet.SignalR.Hub.get_Clients()'。

有人可以告诉我我缺少什么吗?

提前谢谢你!

安德烈

【问题讨论】:

  • 如果您为 SignalR JS 客户端启用日志记录,您可能能够在浏览器控制台中获得有用的诊断信息。只需在致电start() 之前添加$.connection.hub.logging = true;
  • @halter73 感谢您的建议!这样做了,尝试调用该方法时控制台中显示的错误是:[09:10:30 GMT+0200] SignalR:notificationhub.Hello 无法执行。错误:找不到方法:“Microsoft.AspNet.SignalR.Hubs.IHubCallerConnectionContext Microsoft.AspNet.SignalR.Hub.get_Clients()”。不幸的是,到目前为止,我找不到有关此特定错误的太多信息。有什么想法吗?谢谢!
  • 您使用的是什么版本的 SignalR?从 2.1.0 开始,get_Clients 应该返回 IHubCallerConnectionContext&lt;dynamic&gt; 而不是 IHubCallerConnectionContext。如果您针对 SignalR = 2.10,则可能会发生您看到的错误。
  • @halter73 你刚刚救了我!我从来没有想过它——尤其是我使用 Nuget 安装了 SignalR.Core 并且预计会有相同的版本(奇怪的是它没有发生!)。非常感谢您的帮助!
  • @halter73 为我的问题添加一个答案,以便我接受它:)

标签: asp.net asp.net-mvc windows-services signalr


【解决方案1】:

从 2.1.0 开始,get_Clients 应该返回 IHubCallerConnectionContext&lt;dynamic&gt; 而不是 IHubCallerConnectionContext

如果您针对 SignalR = 2.10,则可能会发生您看到的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 2013-07-14
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多