我有以下JS工作:
var chat = $.connection.appHub;
Run Code Online (Sandbox Code Playgroud)
我的应用程序有一个集线器,AppHub可处理两种类型的通知 - Chat和Other.我正在使用单个集线器,因为我需要始终访问所有连接.
我需要能够OnConnected通过以下内容告诉它是哪种类型:
[Authorize]
public class AppHub : Hub {
private readonly static ConnectionMapping<string> _chatConnections =
new ConnectionMapping<string>();
private readonly static ConnectionMapping<string> _navbarConnections =
new ConnectionMapping<string>();
public override Task OnConnected(bool isChat) { // here
string user = Context.User.Identity.Name;
if (isChat){
_chatConnections.Add(user, Context.ConnectionId);
_navbarConnections.Add(user, Context.ConnectionId);
} else{
_navbarConnections.Add(user, Context.ConnectionId);
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法最好是这样的:
var chat = $.connection.appHub(true);
Run Code Online (Sandbox Code Playgroud)
如何从javascript将该参数传递到集线器?
更新:
发信息:
// will have another for OtherMessage
public void …Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中有套接字通知,当我在本地运行时工作得很好,但是当我部署到我的VM时,它会抱怨给出以下消息.
Error: Error during negotiation request.
at Object.signalR._.error (jquery.signalR.js:178)
at signalR.fn.signalR.start.onFailed (jquery.signalR.js:644)
at Object.signalR.fn.signalR.start.connection._.negotiateRequest.signalR.transports._logic.ajax.error (jquery.signalR.js:664)
at n.Callbacks.j (jquery.js:3094)
at Object.n.Callbacks.k.fireWith [as rejectWith] (jquery.js:3206)
at x (jquery.js:8261)
at XMLHttpRequest.n.ajaxTransport.k.cors.a.crossDomain.send.b (jquery.js:8600)
Run Code Online (Sandbox Code Playgroud)
它跨越域名,但我相信我已经超越了CORS问题,但我可能错了.
编辑
以下是我知道会被问到的其他信息.
请求:
GET http://path.to.my.vm/api/notifications/emmit/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22testemitter%22%7D%5D&_=1432140840826 HTTP/1.1
Host: path.to.my.vm
Connection: keep-alive
Accept: text/plain, */*; q=0.01
Origin: http://localhost:8100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost:8100/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en,fr;q=0.8,en-US;q=0.6
Run Code Online (Sandbox Code Playgroud)
响应:
HTTP/1.1 500 Internal Server Error
Date: Wed, 20 May 2015 …Run Code Online (Sandbox Code Playgroud) 我正在使用带有Signalr 1.0.0软件包的VS2012"Fall"更新.调用服务器端功能正常.但是不调用客户端功能.当onBroadcastMessage()调用(见下文)时似乎没有任何事情发生.
问题:
谢谢!
服务器代码:
using Microsoft.AspNet.SignalR;
namespace KPMain
{
public class RealtimeConnectionHub : Hub
{
public void BroadcastMessage(string name, string message) {
Clients.All.onBroadcastMessage(name, message);
}
}
}
Run Code Online (Sandbox Code Playgroud)
路线登记:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes) {
HubConfiguration hubConfig = new HubConfiguration();
#if DEBUG
hubConfig.EnableDetailedErrors = true;
#endif
routes.MapHubs(hubConfig);
...
}
}
Run Code Online (Sandbox Code Playgroud)
客户代码(简化):
var rtcom = new RealtimeConnection();
rtcom.init({debug: true}, function () {
rtcom.subscribe(function (sender, message) {
if (message) {
alert("message");
}
});
}); …Run Code Online (Sandbox Code Playgroud) 我刚刚开始测试SignalR以监控应用程序.我有一个控制器,可以通过客户端调用Hub.我注意到,每次客户端使Connection.Hub.Start()在服务器中创建一个新的Hub实例时,我需要一直刷新我的控件,所以我不希望它为每个实例创建新的Hub.
有没有办法为所有客户创建单个集线器,或者我错过了什么?
我刚刚更新了一些SignalR引用,但为了允许一般类型的Hub,情况有所改变Hub<T>.在现有的示例和文档中,例如:
我们有一个静态类,通过以下机制保存对客户端的引用:
public class StockTicker()
{
private readonly static Lazy<StockTicker> _instance = new Lazy<StockTicker>(
() => new StockTicker(GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients));
IHubConnectionContext Clients {get;set;}
private StockTicker(IHubConnectionContext clients)
{
Clients = clients;
}
}
Run Code Online (Sandbox Code Playgroud)
因此检查静态引用,如果为null则它会到达:
GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients
Run Code Online (Sandbox Code Playgroud)
创建实例并通过构造函数提供客户端.
所以这就是它以前的工作方式,而且确实是上面的网址是如何工作的.但现在Hub<T>构造函数需要稍微改变:
private StockTicker(IHubConnectionContext<dynamic> clients)
{
Clients = clients;
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是如何进一步扩展这一点,以便我的StockTicker版本可以为x类型的客户端提供强类型属性.
IHubConnectionContext<StockTickerHub> Clients {get;set;}
private StockTicker(IHubConnectionContext<dynamic> clients)
{
Clients = clients; // Fails, wont compile
}
Run Code Online (Sandbox Code Playgroud)
通过维护强类型引用,我可以调用强类型方法等.
我正在尝试将参数添加到与signalr的连接中.
我正在使用Builder来创建我的客户端连接并启动它:
var connection = new HubConnectionBuilder()
.WithUrl("http://10.0.2.162:5002/connection")
.WithConsoleLogger()
.WithMessagePackProtocol()
.WithTransport(TransportType.WebSockets)
.Build();
await connection.StartAsync();
Run Code Online (Sandbox Code Playgroud)
我想在这个连接中发送一个简单的参数:类似于:
"令牌":"123"
在我的服务器端,我想我可以从HttpContext中获取此参数:
public override Task OnConnectedAsync()
{
var httpContext = Context.Connection.GetHttpContext();
var token = httpContext.Request.Query["Token"];
return base.OnConnectedAsync();
}
Run Code Online (Sandbox Code Playgroud)
知道怎么发送这个参数吗?谢谢.
我们遇到了SignalR的问题.我们有一个拍卖网站,可以通过信号灯进行实时出价.我们修复了浏览器的一些问题,一切似乎都运行良好.然后我们在我们的服务器上安装了新的遗物并注意到我们每分钟都在信号器连接,重新连接和中止上获得http错误代码400.这是一个截图:
根据新遗迹,SignalR连接和重新连接是网站最耗时的操作.
这是SignalR后端代码(我们使用sql server作为signalr backplane):
public class SignalRHub : Hub
{
public void BroadCastMessage(String msg)
{
var hubContext = GlobalHost.ConnectionManager.GetHubContext<SignalRHub>();
hubContext.Clients.All.receiveMessage(msg);
}
}
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
string appString=string.Empty;
//Gets the connection string.
if (System.Configuration.ConfigurationSettings.AppSettings["SignaRScaleoutConn"] != null)
{
appString = System.Configuration.ConfigurationSettings.AppSettings["SignaRScaleoutConn"].ToString();
}
GlobalHost.DependencyResolver.UseSqlServer(appString);
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromMinutes(15); //I added this timeout, but it is not required.
app.MapSignalR();
}
}
Run Code Online (Sandbox Code Playgroud)
javascript客户端看起来像这样,它很冗长,但大多数是jQuery来影响DOM,我把它包括在内以防万一内部可能有问题.
$(function () {
var chatProxy = $.connection.signalRHub;
$.connection.hub.start();
chatProxy.client.receiveMessage = function (msg) {
var all …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用SignalR的用户跟踪解决方案,作为学习SignalR的有趣项目,用于ASP.NET MVC应用程序.
目前,我可以跟踪已记录的用户以及他们在特定页面上的时长.如果他们移动到另一个页面,我也跟踪它并且SignalR正在更新的计时器重置...许多其他功能被实现或部分实现.
我面临的问题是如何在SignalR集线器内获得完整的URL控制器/动作/参数?
当我使用HttpContext.Current.Request.Urlurl时总是/ signalr/connect.
注意:
var hub = $.connection.myHub;
$.connection.hub.start();
Run Code Online (Sandbox Code Playgroud)
在_Layout.cshtml中.
更新:
我试过用
var location = '@HttpContext.Current.Request.Url';
var hub = $.connection.myHub;
$.connection.hub.start().done(function () {
hub.setLocation(location);
});
Run Code Online (Sandbox Code Playgroud)
并且位置正确传递但我不需要在Connect()任务上使用它.是否有可能做到这一点?
更新2:
这种方法不起作用
var hub = $.connection.myHub;
$.connection.hub.start(function(){hub.setLocation(location)});
Run Code Online (Sandbox Code Playgroud)
就像Connect()之前所说的那样.
在我的中心我有几种方法,但我想传递一个值(在我的情况下是一个位置)Connect(),这可能吗?
public class MyHub : Hub, IDisconnect, IConnected
{
public Task Connect()
{
//do stuff here
//and i would like to have the **location** value
}
public Task Disconnect()
{
//do stuff here
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个方法集线器,称为客户端.此方法启动一个带有委托的计时器,该委托每10秒运行一次.如果在没有人连接到集线器的情况下继续运行此委托是没有意义的,我想在重新计划之前检查是否有任何用户仍然从委托内部连接.有没有办法做到这一点?
使用SignalR(v2.0.2)我得到了这个例外:
Value cannot be null.
Parameter name: o
at Newtonsoft.Json.Utilities.ValidationUtils.ArgumentNotNull(Object value, String parameterName)
at Newtonsoft.Json.Linq.JToken.FromObjectInternal(Object o, JsonSerializer jsonSerializer)
at Newtonsoft.Json.Linq.JToken.FromObject(Object o, JsonSerializer jsonSerializer)
at Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.Invoke[T](String method, Object[] args)
Run Code Online (Sandbox Code Playgroud)
我正在使用反射调用HubProxy,并且我传入了一些触发此错误的空参数(也就是说,其中的一些项Object[] args为null).但是,将参数传递给方法的null是完全合法的事情.这是SignalR中的一个错误,因为它试图序列化空参数,或者它是否是Json.NET(v6.0.1)中的一个错误,因为它不应该尝试序列化一个空对象?