我创建了一个新的VS 2013项目,并使用Firefox浏览器查看了default.aspx页面.当我检查它已经进行的网络通话时,我看到它不断调用:
http://localhost:50682/6a663a78019845d5ade4a328cad09cc2/arterySignalR/poll?transport=longPolling&connectionToken=AQAAANCMnd8BFdERjHoAwE%2FCl%2BsBAAAAOBmDwPWa2ky2MAZXFHBMVAAAAAACAAAAAAAQZgAAAAEAACAAAADSADQXBVKiKczflJ0OzUjOLduFTJE4zd%2FLHWGpDfXnuAAAAAAOgAAAAAIAACAAAACyEX81VwilygfphPoEKCYQ6ZwrkzExoKfZzEMkqBKqqzAAAADG%2BDJbrEFOfsNm9OKhqacnGseQvrwy5kmyZnI5YJiZbjYFgzMELXHfwA7Sxjj4osJAAAAAvQvoG4N0nn8eB9FRaJaZyqaUDF%2F9ypvGN%2B%2BVefnx8U1Fq6P9HXO9vEC%2BfA2s8R4jik58rD4IcFMjM4P8l5kv6g%3D%3D&messageId=d-F1180A0E-W%2C0%7Cl%2C4%7Cm%2C0&requestUrl=http%3A%2F%2Flocalhost%3A50656%2Fdefaulttest&browserName=Firefox&tid=4&_=1384207744328
Run Code Online (Sandbox Code Playgroud)
它为什么这样做?我如何停止这些电话?我看到每隔6秒对上述URL进行无限次调用.请帮助我理解这一点并解决这个问题.
任何人都可以让我知道SignalR如何以高水平的方式在内部工作?
我猜它正在使用刷新数据,Response.Flush
并且在客户端它以一定的间隔发送Ajax请求.这是对的吗?
我最近一直在搜索和阅读SignalR,虽然我看到很多关于Hubs和Persistent Connections之间差异的解释,但是我还没能把我的脑袋放到下一个级别,这就是为什么我会选择一种方法而不是另一种?
我有一个使用ASP.NET开发的单页Web应用程序.我最近使用SignalR库将许多Web方法转换为基于推送的方法.这真的大大增加了页面,减少了页面上的大量服务器调用.
与此同时,我也一直在寻找RESTful ASP.NET WebAPI的一些服务器端方法,真正的美妙之处在于它允许在我开发的同时为外部应用程序创建API.核心应用程序(这对我正在做的事情很重要).
然而,在看了几篇文章和这 两个问题后,似乎推送和WebAPI方法似乎是两种完全不同的客户端 - 服务器通信范例.我敢肯定我可以创建各种方法,可以通过任何协议访问,但我不确定是否有这个陷阱或如果这被认为是草率 - 也许有一个更优雅的方式来实现我的目标对于.
在某种情况下,我希望RESTful WebAPI通过SignalR集线器广播事件......相反(SignalR需要访问WebAPI)似乎不太可能,但我认为仍然可能.
有没有人这样做过?有没有人对如何进行有任何建议或提示?这里最优雅的方式是什么?
我正在尝试使用SignalR应用程序创建Redis消息总线故障转移方案.
首先,我们尝试了一个简单的硬件负载均衡器故障转移,它只监控两台Redis服务器.SignalR应用程序指向单个HLB端点.然后我失败了一台服务器,但无法成功通过第二台Redis服务器获取任何消息,而没有回收SignalR应用程序池.可能这是因为它需要向新的Redis消息总线发出设置命令.
从SignalR RC1开始,Microsoft.AspNet.SignalR.Redis.RedisMessageBus
使用Booksleeve RedisConnection()
连接到pub/sub的单个Redis.
我创建了一个新类,RedisMessageBusCluster()
它使用Booksleeve ConnectionUtils.Connect()
连接到Redis服务器集群中的一个.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using BookSleeve;
using Microsoft.AspNet.SignalR.Infrastructure;
namespace Microsoft.AspNet.SignalR.Redis
{
/// <summary>
/// WIP: Getting scaleout for Redis working
/// </summary>
public class RedisMessageBusCluster : ScaleoutMessageBus
{
private readonly int _db;
private readonly string[] _keys;
private RedisConnection _connection;
private RedisSubscriberConnection _channel;
private Task _connectTask;
private readonly TaskQueue _publishQueue = new TaskQueue();
public RedisMessageBusCluster(string serverList, int db, IEnumerable<string> keys, IDependencyResolver resolver) …
Run Code Online (Sandbox Code Playgroud) 在最新版本的Asp.Net SignalR中,添加了一种使用"IUserIdProvider"接口向特定用户发送消息的新方法.
public interface IUserIdProvider
{
string GetUserId(IRequest request);
}
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我如何知道我向谁发送信息?这种新方法的解释非常肤浅.SignalR 2.0.0的声明草案带有这个bug并且没有编译.有没有人实现过这个功能?
更多信息:http://www.asp.net/signalr/overview/signalr-20/hubs-api/mapping-users-to-connections#IUserIdProvider
拥抱.
既然我已经了解了Node.js,我一直都是它的粉丝.但今天我发现了SignalR,它为ASP.NET提供了另一种异步 - 可扩展 - 实时模型.
据我所知,在的Node.js的SignalR的主要优点是客户机 - 服务器之间共享代码(另一个优势应该在于它是跨平台),和SignalR的主要优势是一个更加成熟的框架和更好工具(IDE)支持.所以我想知道:如果SignalR在这里,我们是否还需要Windows上的Node.js?我不知道Node.js有什么优点吗?
我正在使用SignalR向所有客户广播消息.我需要在我的集线器类之外触发广播,如下所示:
var broadcast = new chatHub();
broadcast.Send("Admin","stop the chat");
我收到错误消息:
不支持使用不是由HubPipeline创建的Hub实例.
是否有使用signalR将消息发送到.net集线器的控制台或winform应用程序的小示例?我已经尝试过.net示例并查看了wiki但是对我来说没有意义的中心(.net)和客户端(控制台应用程序)之间的关系(找不到这个例子).应用程序是否只需要连接集线器的地址和名称?
如果有人可以提供一小段代码,显示应用程序连接到集线器并发送"Hello World"或.net中心收到的内容?
PS.我有一个标准的集线器聊天示例,如果我尝试在Cs中为它分配一个集线器名称,它停止工作,即[HubName("test")],你知道这个的原因吗?
谢谢.
当前控制台应用代码.
static void Main(string[] args)
{
//Set connection
var connection = new HubConnection("http://localhost:41627/");
//Make proxy to hub based on hub name on server
var myHub = connection.CreateProxy("chat");
//Start connection
connection.Start().ContinueWith(task =>
{
if (task.IsFaulted)
{
Console.WriteLine("There was an error opening the connection:{0}", task.Exception.GetBaseException());
}
else
{
Console.WriteLine("Connected");
}
}).Wait();
//connection.StateChanged += connection_StateChanged;
myHub.Invoke("Send", "HELLO World ").ContinueWith(task => {
if(task.IsFaulted)
{
Console.WriteLine("There was an error calling send: {0}",task.Exception.GetBaseException());
}
else
{
Console.WriteLine("Send Complete.");
}
});
} …
Run Code Online (Sandbox Code Playgroud) 我已经建立了一个SignalR集线器来在服务器和客户端之间进行通信.中心服务器端代码存储在名为Hooking.cs的类中.我想要的是能够调用Hooking.cs中定义的方法,允许我从应用程序的任何地方向任何连接的客户端广播消息.似乎为每个客户端/服务器调用创建了一个新的Hooking.cs实例,所以我希望我能够使用像
var hooking = new Hooking();
hooking.Test();
Run Code Online (Sandbox Code Playgroud)
用Hooking.cs中定义的方法Test()如
public static void Test() {
Clients.test()
}
Run Code Online (Sandbox Code Playgroud)
并与客户端javascript
var hooking = $.connection.hooking;
hooking.test = function() { alert("test worked"); };
$.connection.hub.start()
Run Code Online (Sandbox Code Playgroud)
不幸的是,它并不那么简单,因为客户端不是静态的,因此无法从静态方法访问.
通过SignalR源代码,我遇到了一个看起来很有前景的方法Hubs.Invoke(string hubName, string method, params object[] args)
,所以我希望我可以使用类似的东西,Hubs.Invoke("Hooking", "Test")
但是我无法使它工作.
任何有关这方面的帮助将非常感激
signalr ×10
asp.net ×4
c# ×3
signalr-hub ×3
asp.net-mvc ×2
asynchronous ×1
booksleeve ×1
failover ×1
javascript ×1
node.js ×1
real-time ×1
rest ×1