是否有任何示例项目显示如何将SignalR与WinJS Windows 8.1项目一起使用?

时间:2014-12-20 00:13:26

标签: signalr winjs

是否有任何示例项目显示如何将SignalR与WinJS Windows 8.1项目一起使用?不是Windows Phone 8.1,只是使用WinJS的Windows 8.1。

我专门寻找一个示例项目或代码,展示如何将消息推送到所有WinJS客户端。

我已经生成了hubs.js文件并将其包含在我的winjs项目中。我将$ .connection.hub.url设置为正确的url。我可以在提琴手中看到连接已经开始了。

但是,出于某种原因,当我运行代码将消息广播给所有客户端时,没有任何反应。好像服务器认为没有连接任何客户端所以它不会广播任何东西。

以下是我的Web Api项目中的服务器代码:

Startup.cs

    // Branch the pipeline here for requests that start with "/signalr"
    app.Map("/signalr", map =>
    {
        // Setup the cors middleware to run before SignalR.
        // By default this will allow all origins. You can 
        // configure the set of origins and/or http verbs by
        // providing a cors options with a different policy.
        map.UseCors(CorsOptions.AllowAll);

        var hubConfiguration = new HubConfiguration
        {
            EnableDetailedErrors = true,
            EnableJavaScriptProxies = false
        };

        // Run the SignalR pipeline. We're not using MapSignalR
        // since this branch is already runs under the "/signalr"
        // path.
        map.RunSignalR(hubConfiguration);
    });

CommandsHub.cs

[HubName("remoteCommands")]
public class CommandsHub : Hub
{
}

ClientCommand.cs

public class ClientCommand
{
    public string ClientType { get; set; }
    public string CommandName { get; set; }
    public StringDictionary CommandParameters { get; set; }
}

CommandsController.cs(用于允许管理员向客户端广播的ApiController)

    // POST api/values
    public void Post([FromBody]ClientCommand command)
    {
        var cmd = command ?? Notifier.GetTestMessageCommand();
        var notifier = new Notifier();
        notifier.PushCommand(cmd);
    }

Notifier.cs

public class Notifier
{
    public Notifier()
    {
        _context = GlobalHost.ConnectionManager.GetHubContext<CommandsHub>();
    }
    public static ClientCommand GetTestMessageCommand()
    {
        var parameters = new StringDictionary();
        parameters.Add("title", "Message Title");
        parameters.Add("body", "Message Body");
        return new ClientCommand
        {
            ClientType = "XboxOne",
            CommandName = "ShowMessage",
            CommandParameters = parameters
        };

    }

    private IHubContext _context; 
    public void PushCommand(ClientCommand command)
    {
        if (_context == null)
        {
            _context = GlobalHost.ConnectionManager.GetHubContext<CommandsHub>();
        }
        _context.Clients.All.executeRemoteCommand(command);
    }
}

执行以下行,但似乎没有任何事情发生。 Fiddler没有显示任何网络活动,并且具有匹配名称的客户端方法无法运行。

_context.Clients.All.executeRemoteCommand(command);

以下是客户项目的代码:

通过Nuget,我安装了Microsoft ASP.NET SignalR Javascript客户端

我也在使用命令

signalr.exe ghp /o:scripts\\hubs.js

生成我的hubs.js文件,并将其包含在WinJS项目中。

我在default.html中添加了以下内容:

<script src="Scripts/jquery-1.6.4.js"></script>
<script src="Scripts/jquery.signalR-2.1.2.js"></script>
<script src="js/hubs.js" defer="defer"></script>
<script src="js/SignalRConfig.js" defer="defer"></script>

SignalRConfig.js

(function signalRInit(){     &#34;使用严格的&#34 ;;

WinJS.Namespace.define("Starz", {
    RemoteCommands: WinJS.Class.define(
        function ctor() {
            $.connection.url = "http://starzsignlalr.test:19046/signalr"
            $.connection.hub.url = "http://starzsignlalr.test:19046/signalr";  //TODO: Change "http://starzsignlalr.test:19046/" to a valid website host name setup on your dev box that is running the SignalRMessageService web project.
            $.connection.hub.start().done(this._init);
        },
    {
        _init: function () {
            var hub = $.connection.remoteCommands;
            hub.client.executeRemoteCommand = Starz.RemoteCommands.executeRemoteCommand;
        }
    },
    {
        //add static properties and methods here.
        executeRemoteCommand: function (command) {
            var clientId = command.clientId;
            var commandName = command.commandName;
            var commandParameters = command.commandParameters;
        }
    }),
});

})();

在default.js中,在onactivated事件之后,我调用:

var pushSystem = new Starz.RemoteCommands();

初始化SignalR连接。

1 个答案:

答案 0 :(得分:1)

所以我弄明白了我的问题。显然,在调用$ .connection.hub.start()之前,必须使用hub客户端注册客户端javascript方法。

这篇文章:

SignalR JS Client Methods Not Invoked

提供了答案。