signalR事件

时间:2015-11-08 19:18:26

标签: google-chrome google-chrome-extension signalr signalr-hub signalr.client

我正在构建一个与服务器端外部SignalR HUB通信的Chrome扩展程序。

如果我在弹出页面中编写JS代码,我已设法将两者配置为彼此通信,此方法的问题是如果未打开扩展,则无法获取更新(没有回应引发的事件。)

为了解决这个问题,我读到我应该在background.js中编写我的事件处理程序,所以即使弹出的扩展程序没有显示 - 它仍然会响应事件。但是,我仍然需要支持我的扩展程序上的按钮单击才能触发事件 - 在读取更多信息之后,我无法访问后台文件中的DOM。

所以我的问题是如何解决这个问题?我怎样才能从客户端调用服务器SignalR HUB中的函数(或发出ajax请求)?当弹出窗口未打开时,也会收到服务器的响应。

通过回复我的意思是更新background.js中的值和图标徽章中的值的简单+1,将会通知用户发生了某些事情。

我对Chrome扩展程序很新,所以我很感激帮助!

这是我目前的代码:

的manifest.json

{
  "manifest_version": 2,

  "name": "Getting started ex1ample",
  "description": "This extension shows a Google Image search result for the current page",
  "version": "1.0",

  "background": {
    "scripts": ["jquery-2.1.4.min.js", "jquery.signalR-2.2.0.min.js", "background.js"],
    "persistent": false
  },
  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },

  "permissions": [
    "activeTab",
    "http://localhost:61275/"
  ]
}

background.js

var singalR = {};

$(document).ready(function(){
    singalR.connection = $.hubConnection('http://localhost:61275/signalr/hubs', {useDefaultPath: false});
    singalR.connection.logging = true;
    singalR.roomIndexHubProxy = singalR.connection.createHubProxy('roomIndexHub');

    singalR.connection.start().done(function() {
        // Wire up Send button to call RoomIndexHubProxy on the server.
        console.log('Hub has started');
        $("#btn-join").click(function(){
            singalR.roomIndexHubProxy.invoke('test', 111);
        });
    });

    singalR.connection.error(function (error) {
        console.log('SignalR error: ' + error)
    });

    singalR.roomIndexHubProxy.on('test', function (val) {
        chrome.browserAction.setBadgeText({ text: val } );
    });
});

popup.html

<!doctype html>
<html>
  <head>      
    <script src="popup.js"></script> //empty for now
  </head>
  <body>
    <button id="btn-join">Join</button>
  </body>
</html>

服务器端HUB

public class RoomIndexHub : Hub
    {
        static int val = 0;
        public RoomIndexHub(){

        }

        public async Task test(int k)
        {
            var hubContext = GlobalHost.ConnectionManager.GetHubContext<RoomIndexHub>();
            val++;
            await Task.Delay(4000);
            hubContext.Clients.All.test(val.ToString());
        }
    }

1 个答案:

答案 0 :(得分:0)

您是否尝试过设置背景页的生命周期?将持久性设置为true,这样后台隐藏的页面将一直“生存”,并能够监听传入的请求。

"background": {
    "scripts": ["background.js"],
    "persistent": true
  },

这将为您提供持久的背景页面。

请检查:Chrome documentation for event pages

Reards 卡斯滕