Сигналр на Xamarin.iOS-случайно не удается вызвать метод концентратора


У меня есть простой Hub, работающий в Azure, который отлично работает из консольного приложения в Windows.

Я только что построил простой тест Xamarin.приложение iOS, и оно дает какое-то странное поведение.

  1. случайно на LTE / Wifi или симуляторе / устройстве-вызов метода концентратора завершается неудачей с There was an error invoking Hub method X
  2. случайно около 50% - все работает идеально, как и консольное приложение на Windows - эти два даже посылают сообщения друг другу

Я проверил это на iPhone 5S и iPhone 4S для устройств.

Есть идеи, почему это произойдет? Я использую портативный пакет NuGet версии 2.0.0.

Обновление:

Вот что я получаю, когда включаю трассировку (я отключил свой домен):

2013-11-25 07:47:48.204 MyApp[5163:80b] 13:47:48.1865420 - null - ChangeState(Disconnected, Connecting)
2013-11-25 07:47:49.025 MyApp[5163:6b03] 13:47:49.0247930 - d84a25b3-b426-4f0b-b4bc-7d170e3c1bd9 - SSE: GET http://mydomain.cloudapp.net/signalr/connect?transport=serverSentEvents&connectionToken=pVF6LN7KBOem7Ng2hrhx6dSByFe%2BxCr4u6RlY5V%2FtKf%2BHmOoJD5DfVpMySiUuDOaiIPlHI%2FtliqvuddvcDxnZQqi9tIYAxuyZOjYSG%2B9%2Fnx%2FQ%2B6m&connectionData=[{"Name":"MainHub"}]&noCache=c3d54c1d-ee78-49cc-85b4-2c87a024c32a
2013-11-25 07:47:49.203 MyApp[5163:6b03] 13:47:49.2023660 - d84a25b3-b426-4f0b-b4bc-7d170e3c1bd9 - SSE: OnMessage(Data: initialized)
2013-11-25 07:47:49.319 MyApp[5163:6b03] 13:47:49.3189120 - d84a25b3-b426-4f0b-b4bc-7d170e3c1bd9 - SSE: OnMessage(Data: {"C":"s-0,CF9","S":1,"M":[]})
2013-11-25 07:47:49.332 MyApp[5163:6b03] 13:47:49.3318670 - d84a25b3-b426-4f0b-b4bc-7d170e3c1bd9 - ChangeState(Connecting, Connected)
2013-11-25 07:47:49.634 MyApp[5163:6b03] 13:47:49.6339640 - d84a25b3-b426-4f0b-b4bc-7d170e3c1bd9 - SSE: OnMessage(Data: {"C":"s-0,CFA","G":"54eYUWzlKXr9ezIoP1rZvj4DOQ00lfpXZ62PV+HwgzqCvgET2otfFNud1KzX24MjGplzkOwpyzqrVJ1jffBMyWppsDt9Tl+D25btqsxJWt6bBg3v4YfwobBKbpZaScgk/gPp5w==","M":[]})
2013-11-25 07:47:49.703 MyApp[5163:6b03] 13:47:49.7029070 - d84a25b3-b426-4f0b-b4bc-7d170e3c1bd9 - SSE: OnMessage(Data: {"C":"s-0,CFB","M":[]})
2013-11-25 07:47:58.090 MyApp[5163:6b03] 13:47:58.0894910 - d84a25b3-b426-4f0b-b4bc-7d170e3c1bd9 - SSE: OnMessage(Data: {})
2013-11-25 07:48:08.108 MyApp[5163:6b03] 13:48:08.1084000 - d84a25b3-b426-4f0b-b4bc-7d170e3c1bd9 - SSE: OnMessage(Data: {})
2013-11-25 07:48:18.118 MyApp[5163:6b03] 13:48:18.1178390 - d84a25b3-b426-4f0b-b4bc-7d170e3c1bd9 - SSE: OnMessage(Data: {})
2013-11-25 07:48:22.097 MyApp[5163:6b03] 13:48:22.0968150 - d84a25b3-b426-4f0b-b4bc-7d170e3c1bd9 - OnMessage({"I":"0","E":"There was an error invoking Hub method 'MainHub.SignOn'."})

Пустое OnMessage, будет продолжать печатать так часто после сбоя.

Обновление #2

После тестирования и дальнейшей проверки, это кажется более вероятным случайным, чем связанным с LTE vs Wifi. Резюмируя, все прекрасно работает на моей машине локально. Только не при развертывании в Azure. В основном вызов метода концентратора будет таймаутом, при случайных вхождениях.

Вот несколько вещей, которые я сделал, которые сделали эту проблему более редкой, но она все еще происходит:

  1. Сила LongPollingTransport, несмотря ни на что
  2. добавьте Task.Delay между успешным Start и первым Invoke

Я установил EnableDetailedErrors в true на сервере, и это, кажется, то, что происходит на сервере сторона:

Error in SignOn: System.Threading.Tasks.TaskCanceledException: A task was canceled.
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at MyNamespace.MainHub.<SignOn>d__0.MoveNext(); TraceSource 'w3wp.exe' event
Что, я думаю, просто связано с тем, что клиент сдается. Я видел некоторыепроблемы Github , связанные с этим в Azure, но они помечены как закрытые...

Обновление #3

По своей прихоти я развернул его в стандартном разделе веб-сайтов Azure вместо облачных служб. После этого все работало нормально. Есть идеи, почему? Я могу использовать веб-сайты Azure для этого, очевидно, но почему он не будет работать как облачная служба?

1 3

1 ответ:

На данный момент решение заключается в использовании веб-сайтов Azure вместо облачных служб.

Когда у меня будет время, я создам репро и отправлю его на страницу SignalR GitHub issues. Я смогу сделать это позже на этой неделе.