SignalR Hub - 在第三方插件中映射

时间:2017-07-07 12:44:25

标签: iis signalr

我需要使用SignalR和软件的内置功能创建扩展作为第三方。首先,我阅读了Stackoverflow上的所有问题和答案,并总结如下(我不确定,如果一切正确的话):

  • app.MapSignalR()的第二次调用(其中app来自IAppBuilder类型)是无用的,因为javascript代理已经构建并缓存
  • 需要在设置RouteTable之前进行调用。
  • 据我所知,MapSignalR会搜索所有已加载程序集中从Hub派生的类,并根据需要实例化它们。

之前提到的软件将应用程序作为IIS的HTTPModule启动,并在某处(对我来说是黑盒)中心的映射发生。我试图事先用我的Hub加载我的程序集,因此我的程序集也可用于集线器的注册,虽然当我尝试通过$ .connection.adminHub访问它时(见下面的例子),但我失败了。

我的方法中的错误在哪里?

编辑1 (2017年7月17日)

AdminHub的目标:为应用程序中的特定客户端提供服务器端点,以调用刷新浏览器的客户端功能(强制在没有缓存的情况下重新加载)。 我设法构建了一个可以独立运行的ASP.NET应用程序:

AdminHub.cs

using Microsoft.AspNet.SignalR;

namespace HelloSignalR
{
   public class AdminHub : Hub
   {
      Clients.All.refresh();
   }
}

的index.html

<!DOCTYPE html>
<html>
<head>
    <title>Admin App of SignalR</title>
    <meta charset="utf-8" />
    <script type="text/javascript" src="/Scripts/jquery-1.6.4.min.js"></script>
    <script type="text/javascript" src="/Scripts/jquery.signalR-2.2.2.min.js"></script>
    <script type="text/javascript" src="/signalr/hubs"></script>
    <script type="text/javascript" src="/Scripts/Admin.js"></script>
</head>
<body>
    <h1>Admin Page for Reload all clients</h1>
    <button id="refreshButton">Refresh without cache</button>
</body>
</html>

Startup.cs

using Microsoft.Owin;
using Owin;
using Microsoft.AspNet.SignalR;

[assembly: OwinStartup(typeof(HelloSignalR.Startup))]

namespace HelloSignalR
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR(new HubConfiguration());
        }
    }
}

Admin.js

(function () {
    $(document).ready(function () {
        // Thereby browsers reload pretty quickly,
        // output an alert for the user, that he gets noticed about refresh
        alert("I'm loaded or reloaded.");

        // Target function of broadcasting via SignalR to all
        $.connection.adminHub.client.refresh = function() {
            window.location.reload(true); // forcing to forget about browser cache
        }

        // if the hub has been loaded, register click handler
        // if clicked refresh everywhere (without browser cache)
        $.connection.hub.start().done(function () {
            $("#refreshButton").click(function () {
                alert("Button clicked!");
                $.connection.adminHub.server.reloadAll();
            })
        });
    });
})();

对于第三方插件,我只在程序集中包含AdminHub.cs,因为其余部分是无用的:我想要扩展的软件在开始时成功地映射了自己的集线器,但不是我的。

我感谢任何技巧或变通方法......

0 个答案:

没有答案