如何使用SignalR将javascript中的字符串数组传递给服务器?
我在javascript中有一个数组,并希望将此功能发送到Hub
var selected = new Array();
$('#checkboxes input:checked').each(function () {
selected.push($("input").attr('name'));
});
Run Code Online (Sandbox Code Playgroud)
该功能应该采用什么类型的参数?
我正在尝试建立一个.Net客户端,从我的服务层向我的signalR集线器发送消息.我正在关注本指南:http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-net-client#callserver
这就是我所拥有的:
_hubConnection = new HubConnection(_baseUrl); // "http://localhost:3806"
_hubProxy = _hubConnection.CreateHubProxy("AppHub");
_hubConnection.Start().Wait();
Run Code Online (Sandbox Code Playgroud)
该集线器位于同一个项目中 - 它是一个带有表单身份验证的MVC应用程序.
我永远无法通过.Wait()调用,它总是出错以下内容:
Message=Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
Source=Newtonsoft.Json
Run Code Online (Sandbox Code Playgroud)
更多痕迹:
在Microsoft.AspNet.SignalR.Client.Transports.TransportHelper.b_中的Newtonsoft.Json.JsonConvert.DeserializeObject [T](字符串值).在Microsoft.AspNet.SignalR.TaskAsyncHelper上的字符串原始字符串.<> c _DisplayClass19
2.<Then>b__17(Task1 t)在Microsoft.AspNet.SignalR.TaskAsyncHelper.TaskRunners2.<>c__DisplayClass3a.<RunTask>b__39(Task1 t)
我有AppHub:
public class AppHub : Hub {
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
是否可以在不执行停止和启动的情况下更改SignalR连接上的查询字符串?
我这样做:
$.connection.hub['qs'] = {arg1: 'kkkk', arg2: 'xxx',...};
$.connection.hub.stop();
$.connection.hub.start();
Run Code Online (Sandbox Code Playgroud)
这种停止/启动导致我的系统将其解释为连接中断,出于多种原因这是不可取的.
当我删除它时,使用较旧的查询字符串参数调用方法.
我目前正在玩SignalR 2.0.3,使用Backslane扩展,使用Redis for windows http://msopentech.com/blog/2013/04/22/redis-on-windows-stable-and-reliable/
我已经在VS中集成了相应的SignalR.Redis包.
我对我的创业做了以下更改:
GlobalHost.DependencyResolver.UseRedis(
server: "localhost",
port: 6379,
password: string.Empty,
eventKey: "BroadcasterExample"
);
app.MapSignalR(hubConfiguration);
Run Code Online (Sandbox Code Playgroud)
它建立得很好.我的客户端似乎连接正常.我可以在客户端和服务器之间发送通知,反之亦然.
从Redis客户端,我可以输入:
get BroadcasterExample
which returns: "3"
Run Code Online (Sandbox Code Playgroud)
我认为事情正在发挥作用,但......
几个问题: 1)我怎么知道它实际上有效?
2)我可以在Redis服务器上检查什么(虽然是Redis客户端)?
3)什么是存储在什么数据结构(键/值对,列表,散列,集)?
我想深入了解一下发生了什么.我查看了以下命令:http: //redis.io/commands 没有什么是跳出来的,这将帮助我映射真实情况.
有人能指出我在正确的方向吗?
谢谢,JohnB
假设我在www.website.com上有一个网站.我的带信号器的SaaS托管在www.signalr.com上.
我可以从www.website.com连接到www.signalr.com信号服务器吗?
代替 :
var connection = $.hubConnection();
var contosoChatHubProxy = connection.createHubProxy('contosoChatHub');
Run Code Online (Sandbox Code Playgroud)
就像是 :
var connection = $.hubConnection();
var contosoChatHubProxy = connection.createHubProxy('www.signalr.com/contosoChatHub');
Run Code Online (Sandbox Code Playgroud) 我们正面临类似的问题,如https://github.com/SignalR/SignalR/issues/3353
当我们启动我们的应用程序时,一段时间后连接到集线器的所有用户开始重新连接问题.
在Chrome控制台中,所有用户都会看到这种情况:
jquery.signalR.min.js WebSocket连接到'wss:// [我们的站点url]/signalr/reconnect?transport = webSocke ... HcDfA%3D%3D&connectionData =%5B%7B%22name%22%3A%22myhub%22% 7D%5D&tid = 10'失败:WebSocket握手期间出错:意外响应代码:404
所有用户都处于重新连接模式,即此方法将持续为所有用户触发:
connection.hub.stateChanged(function (change) {
if (change.newState === $.connection.connectionState.reconnecting) {
failPendingMessages();
ui.showStatus(1, '');
}
else if (change.newState === $.connection.connectionState.connected) {
if (!initial) {
ui.showStatus(0, $.connection.hub.transport.name);
ui.setReadOnly(false);
} else {
ui.initializeConnectionStatus($.connection.hub.transport.name);
}
initial = false;
}
else if (change.newState === $.connection.connectionState.disconnected && initial === true) {
initial = false;
}
});
Run Code Online (Sandbox Code Playgroud)
我们正在使用Jabbr源代码中的代码.
状态正在从连接>重新连接>双向连接>连接
似乎有很多连接后,所有与Hub的连接仍然卡住,即无法正确地与集线器通信,因此连接断开,我们收到"WebSocket握手:意外响应代码:404",我上面提到过.
请注意,此行为/问题没有固定的时间.有时它会在"应用程序启动"的几分钟内开始,有时需要大约20-30分钟.
这个问题肯定是因为许多连接通过Hub同时与Signalr核心代码进行通信.
它有什么问题吗?
编辑:我们使用的是最新版本的Signalr,即Microsoft.AspNet.SignalR.Core.dll(2.2.0)
几个星期以来,我一直在努力解决这个问题.
我有一个应用程序,我已配置owin后端与web api和autofac DI与后台handfire工作.我几乎关注了Stackoveflow上的每一个问题,但似乎没有任何效果.关于OWIN/Hangfire/WebAPI的我的应用程序似乎都运行正常.直到SignalR推送消息.
如果我从js客户端推送消息调用任何通知集线器端点就可以了,我可以在任何其他连接的客户端上接收推送消息.但是,当我想从我的api控制器或hangfire工作发送消息时,它永远不会到达任何客户端.
Startup.cs
public void Configuration(IAppBuilder app)
{
//var signalRHelper = new SignalRHelper(GlobalHost.ConnectionManager.GetHubContext<NotificationHub>());
var constants = new Constants();
constants.Set(ConstantTypes.AllyHrNoReplyEmailAddress, Util.Constants.AllyHrNoReplyEmailAddress);
constants.Set(ConstantTypes.SendGridKey, Util.Constants.SendGridKey);
constants.Set(ConstantTypes.EncryptionKey, Util.Constants.EncryptionKey);
constants.Set(ConstantTypes.ApiUrl, Util.Constants.ApiUrl);
constants.Set(ConstantTypes.RootFolder, Util.Constants.RootFolder);
constants.Set(ConstantTypes.FrontEndUrl, Util.Constants.FrontEndUrl);
GlobalConfiguration.Configuration
.UseSqlServerStorage("AllyHrDb");
var config = System.Web.Http.GlobalConfiguration.Configuration;
var builder = new ContainerBuilder();
var jobBuilder = new ContainerBuilder();
var signalRBuilder = new ContainerBuilder();
var hubConfig = new HubConfiguration();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
builder.Register(x => constants);
builder.RegisterModule(new ServiceModule());
jobBuilder.Register(x => constants);
jobBuilder.RegisterModule(new HangfireServiceModule());
signalRBuilder.RegisterModule(new SignalRServiceModule());
signalRBuilder.Register(x => constants);
signalRBuilder.RegisterType<AutofacDependencyResolver>().As<IDependencyResolver>().SingleInstance();
signalRBuilder.RegisterType<ConnectionManager>().As<IConnectionManager>().ExternallyOwned().SingleInstance();
signalRBuilder.RegisterType<NotificationHub>().ExternallyOwned().SingleInstance();
signalRBuilder.RegisterType<SignalRHelper>().PropertiesAutowired().ExternallyOwned().SingleInstance();
signalRBuilder.Register(context …Run Code Online (Sandbox Code Playgroud) 我使用SignalR开发了一个Web应用程序,它在我的开发服务器上完美运行.但由于一些未知的原因,它不适用于生产服务器.
我做了一些测试:
$.connection.hub.start().done(function () {
console.log('started');
});
Run Code Online (Sandbox Code Playgroud)
这总是按照预期在控制台中"启动".所以客户端和服务器是连接的.但是,当我发送任何数据,如登录凭据时,我没有收到任何回复.
这是连接帧图像.正如您所看到的,客户端正在向服务器发送数据但未收到任何响应.
public override Task OnConnected()
{
Clients.All.Listen("Connected to HUB");
}
Run Code Online (Sandbox Code Playgroud)
客户端侦听方法:
hub.client.listen = function (response) {
console.log('Listen', response);
}
Run Code Online (Sandbox Code Playgroud)
有一个我用来调试的Listen方法.这不会打印任何东西.所以信号器客户端服务器没有连接.
编辑:
报告的问题在这里:https://github.com/SignalR/SignalR/issues/4279如果这有帮助.
EDIT2:
我的webapp是一个Vue js 2应用程序.我使用vue-cli编译并上传到服务器.我的signalr.js文件是从ASP.NET MVC项目复制的.
我使用SignalR 2.4制作了一个测试ASP.NET MVC 5应用程序,我能够在实时服务器上进行通信.
为什么以下代码无法将我连接到集线器?
****我没有使用Azure函数****
我将天蓝色钥匙放在哪里?
如何建立这个复杂的网址?
这类似于我原来的天蓝色密钥AccessKey = 09988588488378383azudjGHG / E =&Version = 1123.0“;
我知道服务器和集线器正在运行,因为我使用Java创建了示例,并且该示例正在运行(请参见下面的实现)。
无论我尝试使用哪个URL,我都将“断开连接”。
public event EventHandler<MessageEventArgs> OnReceivedMessage;
public void bindConnectionMessage(bool useHttps)
{
string urlRoot = "test.signalr.net/?AccessKey=Iwillneversharethiskeyjajajajaj####/E=&Version=1123.0";
var url = $"http{(useHttps ? "s" : string.Empty)}://{urlRoot}/ChatHub";
hubConnection =
new HubConnectionBuilder().WithUrl
(url)
.Build();
hubConnection.On<string>("Send", (message) =>
{
var finalMessage = $"Sending something {message}";
OnReceivedMessage?.Invoke(this, new MessageEventArgs(finalMessage));
});
hubConnection.On<string>("Echo", (message) =>
{
var finalMessage = $"says {message}";
OnReceivedMessage?.Invoke(this, new MessageEventArgs(finalMessage));
});
hubConnection.StartAsync();
Debug.WriteLine(IsConnected);
}
Run Code Online (Sandbox Code Playgroud)