我在 LongPolling 中使用 SignalR v1.1.3 和 Silverlight v5。
我对客户端上的服务器调用方法有疑问。最后一次通话需要很长时间(近 2 分钟)或被忽略
第一种情况:最后一次通话需要 2 秒
public void TestMethod(){
Clients.Caller.OnTestMethod();
Clients.Caller.OnTestMethod();
}
第一个电话是立即的,第二个电话也立即开始,但需要 2 分钟才能被客户接听。
Fiddler 输出(第二列显示经过的时间):http: //i.stack.imgur.com/BFQi4.png
第二种情况:一通需要2s,一通未接
public void TestMethod(){
Clients.Caller.OnTestMethod();
Clients.Caller.OnTestMethod();
Clients.Caller.OnTestMethod();
Clients.Caller.OnTestMethod();
}
前两个呼叫“快”,第三个需要 2 秒,最后一个从未发送
Fiddler 输出(第 2 列显示经过的时间):http: //i.stack.imgur.com/Yj1fw.png
最后一个案例:最后一个调用需要 2s
public void TestMethod(){
Clients.Caller.OnTestMethod();
Clients.Caller.OnTestMethod();
Clients.Caller.OnTestMethod();
Thread.Sleep(50);
Clients.Caller.OnTestMethod();
}
在最后一个之前添加一个睡眠允许完成呼叫。
Fiddler 输出(第二列显示经过的时间):http: //i.stack.imgur.com/O7p0Y.png
客户端上的代码是
await hubProxy.Invoke("TestMethod");
* 编辑 *
在客户端我有一个服务,它为服务器上找到的每个集线器创建一个 hubproxy:
public MyHubConnection()
{
_hubConnection = new HubConnection(ApplicationHelpers.GetServerRootUri()) {TraceLevel = TraceLevels.All, TraceWriter = Console.Out};
_hubConnection.Error += ErrorFns.HandleError;
}
public async Task StartAsync()
{
var time = DateTime.Now;
var manager = new EntityManager();
var serverHubs = (List<string>)await manager.InvokeServerMethodAsync("Common.SignalRServices, Common", "GetServerHubs");
foreach (var serverHub in serverHubs)
{
_hubRepository[serverHub] = _hubConnection.CreateHubProxy(serverHub);
}
await _hubConnection.Start(new LongPollingTransport());
}
public IHubProxy GetHubProxy(string hubName)
{
if (!_hubRepository.ContainsKey(hubName))
throw new Exception(string.Format("No hub named '{0}'", hubName));
return _hubRepository[hubName];
}
我不知道发生了什么......任何线索?