我想从java客户端连接到SignalR服务器.那可能吗?
有没有人写过一个java-client连接到SignalR?
我在ASP.NET Web应用程序中使用SignalR.在这里,我将客户端从外部调用到集线器类使用IHubContext.我需要获取当前用户的连接ID,以便仅向当前用户发送消息.如何在客户端获取连接ID?
当我尝试HttpContext从HUB 访问当前会话时它返回null.
我尝试使用界面,IRequiresSession但它没有用.有人能帮我吗?
我已经看到了如何通过绑定到.disconnect事件来捕获客户端与SignalR的断开连接事件.
现在我已经完成了这个,我想让客户端进入"等待重新连接循环",它不断尝试连接,直到成功或用户取消.集线器是否公开连接状态属性?我在想(伪代码)
var isConnected;
function onConnected() { isConnected = true; }
hub.disconnect = function() { while(hub.notconnected) { connect(); }
Run Code Online (Sandbox Code Playgroud) 我试图让websockets在我的开发环境中工作:
不幸的是,Javscript客户端正在使用长轮询.当我在客户端强制使用Web套接字时,我根本无法连接:
$.connection.hub.start({ transport: ['webSockets'] })
Run Code Online (Sandbox Code Playgroud)
服务器代码是自托管的,基于示例,如下所示:
static void Main(string[] args)
{
string url = "http://localhost:8081/";
var server = new Server(url);
// Map the default hub url (/signalr)
server.MapHubs();
// Start the server
server.Start();
Console.WriteLine("Server running on {0}", url);
// Keep going until somebody hits 'x'
while (true)
{
ConsoleKeyInfo ki = Console.ReadKey(true);
if (ki.Key == ConsoleKey.X)
{
break;
}
}
}
public class MyHub : Hub
{
public void Send(string message) …Run Code Online (Sandbox Code Playgroud) 我尝试在MVC应用程序中使用SignalR.它工作正常,但我在Chrome控制台中收到以下错误
WebSocket connection to 'ws://localhost:18245/signalr/connect?transport=webSockets&clientProtocol=1.4&connectionToken=bNDGLnbSQThqY%2FSjo1bt
8%2FL45Xs22BDs2VcY8O7HIkJdDaUJ4ftIc54av%2BELjr27ekHUiTYWgFMfG6o7RaZwhf
fpXavzWQ1jvkaxGm5rI%2BWtK7j0g1eQC2aOYP366WmRQLXCiYJfsm4EbwX6T8n2Aw
%3D%3D&connectionData=%5B%7B%22name%22%3A%22importerhub%
22%7D%5D&tid=9' failed: HTTP Authentication failed; no valid credentials available
Run Code Online (Sandbox Code Playgroud)
有趣的是,我通过Hub从Controller调用的jquery方法运行正常.
jQuery的:
$(function () {
// Initialize the connection to the server
var importerHub = $.connection.importerHub;
// Preparing a client side function
// called sendMessage that will be called from the server side
importerHub.client.sendMessage = function (message) {
showOrUpdateSuccessMessage(message);
};
$.connection.hub.start();
});
Run Code Online (Sandbox Code Playgroud)
控制器:
var hubContext = GlobalHost.ConnectionManager.GetHubContext<ImporterHub>();
hubContext.Clients.All.sendMessage("All operations complete");
Run Code Online (Sandbox Code Playgroud)
我使用.Net v4.5.1,SignalR v2.1.2.0和IIS 8.5与Windows身份验证.
我该如何解决这个错误?
我正在使用signalr和asp.net MVC3来构建示例聊天应用程序.这是我的信号器中心的样子
public class MyHub:Hub,IDisconnect
{
public Task Join()
{
string username = HttpContext.Current.User.Identity.Name;
//find group based on username
string group = getGroup(username)
return Groups.Add(Context.ConnectionId, group);
}
public void doStuff()
{
string group = getGroup();
Clients[group].doStuffOnBrowser();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我的应用程序在页面加载时崩溃了.在使用调试器时,我发现HttpContext.Current.User.Identity.Name为null,即使用户已经过身份验证.如何在Task Join()方法中获取用户名?
服务器:
public void AddLine(string line)
{
Clients.Others.addLine(line);
}
Run Code Online (Sandbox Code Playgroud)
.NET客户端:
await rtHubProxy.Invoke("AddLine", "lineInfo");
Run Code Online (Sandbox Code Playgroud)
例外:
InvalidOperationException: There was an error invoking Hub method 'xxx.AddLine'.
Run Code Online (Sandbox Code Playgroud)
实际上,我试图用复杂的对象调用方法,只是为了找到异常.因此,我更改了参数的类型并将AddLine()体留空以进行调试,奇怪的是,它仍然抛出相同的异常.
我在客户端也有另一个SignalR调用,上面只有几行,响应性地运行而没有错误.相应的服务器端代码如下:
public void Hello(string text)
{
Clients.All.hello(text);
}
Run Code Online (Sandbox Code Playgroud)
谁能找到我错在哪里?我已经调试了超过4个小时,即使在我简化代码后仍然无法找到撤消.
(严格检查拼写,没有不匹配.)
我正在实施一个聊天室.到目前为止,这么好 - 用户可以通过JS客户端从他们的浏览器发送消息,我可以使用C#客户端做同样的事情 - 这些消息被广播给其他用户.现在,我正在尝试实施"在线用户".
我的方法如下:
OnConnected - 将数据库中的用户更新为IsOnline = trueOnDisconnected - 如果用户没有任何其他连接,请更新数据库中的用户 IsOnline = false我遇到的问题是OnDisconnected并不总是为每个客户端ID调用 - 过时的连接阻止"如果用户没有任何其他连接"位解析为true,那么用户总是"在线" ".
我能想到的一个hacky解决方案是始终在db中将用户设置为脱机OnDisconnect- 但这意味着如果用户打开两个选项卡并关闭一个选项卡,它们将"脱机".然后,我可以将用户重新设置为联机以获取发送的每条消息,但这似乎完全浪费了处理周期,并且仍然留下了一段时间,当用户真正在线时,用户被视为离线.
我相信,如果有办法保证为每个客户端调用OnDisconnected,这个问题就会消失.它看起来就像如果我离开的客户打开很长一段时间(> 10分钟),然后断开,OnDisconnected不会被调用.我会尽力确定repro步骤并保持更新.
那么 - 这是处理在线状态的有效方法吗?如果是这样,还有什么可以做的,以确保OnDisconnected最终为每个连接触发?
这个问题让我担心,因为现有的Connections会随着时间的推移而继续增长,如果我没有弄错的话,最终因为未处理的状态连接而溢出.
码:
我正在使用内存中的分组方法.
发送消息(C#):
private readonly static ConnectionMapping<string> _chatConnections =
new ConnectionMapping<string>();
public void SendChatMessage(string key, ChatMessageViewModel message) {
message.HtmlContent = _compiler.Transform(message.HtmlContent);
foreach (var connectionId in _chatConnections.GetConnections(key)) {
Clients.Client(connectionId).addChatMessage(JsonConvert.SerializeObject(message).SanitizeData());
}
}
Run Code Online (Sandbox Code Playgroud)
国家管理:
public override Task …Run Code Online (Sandbox Code Playgroud) 我正在尝试在单个项目中使用OWIN,SignalR和Autofac.
我正在设置有关signalR的内容如下:
// Create the AutoFac container builder:
var builder = new ContainerBuilder();
// ...[Register various other things in here]...
// register signalR Hubs
builder.RegisterHubs(Assembly.GetExecutingAssembly());
// Build the container:
var container = builder.Build();
// Configure SignalR with the dependency resolver.
app.MapSignalR(new HubConfiguration
{
Resolver = new AutofacDependencyResolver(container)
});
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我使用Autofac SignalR集成时,我不能再在服务器上获取signalR Hub Context(例如在webapi控制器中),因此无法从服务器端向连接的客户端发送消息.当我不使用Autofac signalR集成时,如下所示:
var hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
hubContext.Clients.All.notification("Test Message");
Run Code Online (Sandbox Code Playgroud)
但是当我将Autofac添加到混合中时,这不起作用 - 我没有得到任何错误消息,我似乎得到了一个hubContext,但是对它的调用实际上似乎并没有到达客户端.
如果我在对MapSignalR的调用中注释掉了对signalR的依赖性解析器的使用,那么对GetHubContext的调用再次起作用并且消息成功地到达signalR客户端,但当然我不能再在我的集线器上使用IoC.例如
// Configure SignalR with the dependency resolver.
app.MapSignalR(new HubConfiguration
{
// Resolver = new AutofacDependencyResolver(container)
});
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么使用AutofacDependencyResolver会阻止GlobalHost.ConnectionManager.GetHubContext正常工作? …
signalr ×10
c# ×6
asp.net ×4
signalr-hub ×3
.net ×2
owin ×2
ajax ×1
asp.net-mvc ×1
autofac ×1
controller ×1
java ×1
jquery ×1
windows-8 ×1