4

У меня есть работающая служба приложений Azure, подключенная к концентратору уведомлений, настроенному с помощью GCM и APNS. Он работает отлично в течение нескольких месяцев на обеих платформах.Регистрация устройства концентратора уведомлений Azure не работает, если служба приложений использует аутентификацию

Теперь я включил проверку подлинности в службе приложений и настроил Google и Facebook. Они также отлично работают, и правильный доступ соблюдается для простых таблиц.

Однако регистрация устройства из мобильного приложения теперь терпит неудачу с момента включения аутентификации.

Ниже ошибка я получаю от службы приложения (NodeJS):

System.NullReferenceException: Object reference not set to an instance of an object. 
    at Microsoft.Azure.AppService.Push.PushRequestHandler.<HandleCreateOrUpdateInstallationAsync>d__14.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at Microsoft.Azure.AppService.Push.PushRequestHandler.<HandlePushRequestAsync>d__f.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at Microsoft.Azure.AppService.Push.PushModule.<OnPostAuthenticateRequestAsync>d__0.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at Microsoft.Azure.AppService.Authentication.HttpModuleDispatcher.<DispatchAsync>d__13.MoveNext() 
2016-11-14T09:43:00 PID[7348] Information Sending response: 500.79 Internal Server Error 
2016-11-14T09:43:00 PID[7348] Critical System.ComponentModel.Win32Exception (0x80004005): An operation was attempted on a nonexistent network connection 
at CHttpRequest.ReadEntityBody(Byte[] buffer, Int32 maxLength, Boolean allowAsync, Int32& bytesReceived, Int32& bytesRemaining, Boolean& completionPending) 
at Microsoft.Azure.AppService.Authentication.HttpRequestBase.AsyncReadHelper.Read() 
at Microsoft.Azure.AppService.Authentication.HttpRequestBase.AsyncReadHelper..ctor(HttpRequestBase request, Int32 maxLength) 
at Microsoft.Azure.AppService.Authentication.HttpRequestBase.<ReadRequestContentAsync>d__8.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at Microsoft.Azure.AppService.Push.PushRequestHandler.<HandleCreateOrUpdateInstallationAsync>d__14.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at Microsoft.Azure.AppService.Push.PushRequestHandler.<HandlePushRequestAsync>d__f.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at Microsoft.Azure.AppService.Push.PushModule.<OnPostAuthenticateRequestAsync>d__0.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at Microsoft.Azure.AppService.Authentication.HttpModuleDispatcher.<DispatchAsync>d__13.MoveNext() 
2016-11-14T09:43:00 PID[7348] Information Sending response: 500.79 Internal Server Error 

Я могу отправлять уведомления (с использованием тест отправки и через мой сервер нажимной кода) к существующим регистрациям, я просто не в состоянии создавать новые регистрации.

Когда я выключу аутентификацию, все работает нормально снова.

Нужно ли вручную создавать регистрации в центре уведомлений в этом сценарии аутентификации?

Я в затруднении относительно того, где я ошибаюсь, поэтому любая помощь будет принята с благодарностью.

+0

Что делает ваш App конфигурации службы выглядит? В частности, опция Push menu? –

+0

Эй, Адриан, спасибо, что ответили. Меню «Мои приложения» Push просто подключено к концентратору, без тэгов и других настроек. Вы запрашиваете файл конфигурации или достаточно скриншотов из фактического портала? – Rys

+0

Мы обнаружили проблему с процессом регистрации push. Прямо сейчас мы получаем патч. Как только мы вытащили исправление, он волшебным образом начнет работать снова. Извините за неудобства здесь. –

ответ

2

В качестве альтернативы RegisterAsync, вызывающего проблему; вы можете использовать вызов HttpClient для установки установки Notification Hub. Следующий код будет создан установки на Android, например:

public async Task RegisterForPushNotifications(MobileServiceClient client) 
{ 
    if (GcmClient.IsRegistered(RootView)) 
    { 
     try 
     { 
      var registrationId = GcmClient.GetRegistrationId(RootView); 
      //var push = client.GetPush(); 
      //await push.RegisterAsync(registrationId); 

      var installation = new DeviceInstallation 
      { 
       InstallationId = client.InstallationId, 
       Platform = "gcm", 
       PushChannel = registrationId 
      }; 
      // Set up tags to request 
      installation.Tags.Add("topic:Sports"); 
      // Set up templates to request 
      PushTemplate genericTemplate = new PushTemplate 
      { 
       Body = "{\"data\":{\"message\":\"$(messageParam)\"}}" 
      }; 
      // Register with NH 
      var response = await client.InvokeApiAsync<DeviceInstallation, DeviceInstallation>(
       $"/push/installations/{client.InstallationId}", 
       installation, 
       HttpMethod.Put, 
       new Dictionary<string, string>()); 
     } 
     catch (Exception ex) 
     { 
      Log.Error("DroidPlatformProvider", $"Could not register with NH: {ex.Message}"); 
     } 
    } 
    else 
    { 
     Log.Error("DroidPlatformProvider", $"Not registered with GCM"); 
    } 
} 

DeviceInstallation класс выглядит следующим образом:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Newtonsoft.Json; 

namespace TaskList.Abstractions 
{ 
    public class DeviceInstallation 
    { 
     public DeviceInstallation() 
     { 
      Tags = new List<string>(); 
      Templates = new Dictionary<string, PushTemplate>(); 
     } 

     [JsonProperty(PropertyName = "installationId")] 
     public string InstallationId { get; set; } 

     [JsonProperty(PropertyName = "platform")] 
     public string Platform { get; set; } 

     [JsonProperty(PropertyName = "pushChannel")] 
     public string PushChannel { get; set; } 

     [JsonProperty(PropertyName = "tags")] 
     public List<string> Tags { get; set; } 

     [JsonProperty(PropertyName = "templates")] 
     public Dictionary<string, PushTemplate> Templates { get; set; } 
    } 

    public class PushTemplate 
    { 
     public PushTemplate() 
     { 
      Tags = new List<string>(); 
      Headers = new Dictionary<string, string>(); 
     } 

     [JsonProperty(PropertyName = "body")] 
     public string Body { get; set; } 

     [JsonProperty(PropertyName = "tags")] 
     public List<string> Tags { get; set; } 

     [JsonProperty(PropertyName = "headers")] 
     public Dictionary<string, string> Headers { get; set; } 
    } 
} 

Место метода в RegisterForPushNotifications() в вашей конкретной платформы код. DeviceInstallation может быть в PCL.

0

Это проблема с толкающим лезвием, а не то, что вы можете решить самостоятельно. Я поступил по электронной почте, чтобы мы могли напрямую поддерживать вас.

+1

И для тех, кто это читает, мы исправили проблему в патче, который мы можем применить к отдельным сайтам. Патч будет выпущен с регулярными обновлениями Службы App. Если вы испытываете это, тогда, пожалуйста, обратитесь ко мне с именем вашего сайта, и я могу получить исправление, примененное к вашему сайту. –

+0

Любые обновления? Все еще не работает ... – Ben

+0

У нас не было никаких сообщений об этом сбое. Вероятно, это новая проблема, которую вы видите. Пожалуйста, откройте новый пост Azure Forum со спецификой (журналы и т. Д.), Чтобы мы могли помочь. –