LongPolling で SignalR v1.1.3 と Silverlight v5 を使用しています。
クライアントのサーバー呼び出しメソッドに問題があります。最後の呼び出しは、非常に長い時間 (2 分近く) かかるか、単に無視されます。
1 番目のケース: 最後の呼び出しに 2 秒かかります
public void TestMethod(){
Clients.Caller.OnTestMethod();
Clients.Caller.OnTestMethod();
}
1 回目の呼び出しはすぐに開始され、2 回目の呼び出しもすぐに開始されますが、クライアントにキャッチされるまでに 2 分かかります。
Fiddler 出力 (2 列目は経過時間を表示): http://i.stack.imgur.com/BFQi4.png
2 番目のケース : 1 回の通話に 2 秒かかり、1 回は不在
public void TestMethod(){
Clients.Caller.OnTestMethod();
Clients.Caller.OnTestMethod();
Clients.Caller.OnTestMethod();
Clients.Caller.OnTestMethod();
}
最初の 2 つの呼び出しは「高速」で、3 番目の呼び出しは 2 秒かかり、最後の呼び出しは送信されませんでした
Fiddler 出力 (2 列目は経過時間を表示): http://i.stack.imgur.com/Yj1fw.png
最後のケース: 最後の呼び出しには 2 秒かかります
public void TestMethod(){
Clients.Caller.OnTestMethod();
Clients.Caller.OnTestMethod();
Clients.Caller.OnTestMethod();
Thread.Sleep(50);
Clients.Caller.OnTestMethod();
}
最後のスリープの前にスリープを追加すると、コールを実行できるようになりました。
Fiddler 出力 (2 列目は経過時間を表示): http://i.stack.imgur.com/O7p0Y.png
クライアント上のコードは
await hubProxy.Invoke("TestMethod");
* 編集 *
クライアントには、サーバー上で見つかったすべてのハブに対してハブプロキシを作成するサービスがあります。
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];
}
何が起こっているのかわかりません...手がかりはありますか?