是否有任何示例项目显示如何将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连接。
答案 0 :(得分:1)
所以我弄明白了我的问题。显然,在调用$ .connection.hub.start()之前,必须使用hub客户端注册客户端javascript方法。
这篇文章:
SignalR JS Client Methods Not Invoked
提供了答案。