0

Я использую Azure Notification Hubs вместе с GCM для отправки уведомлений пользователям моего приложения. Все это отлично работает, пока я не опубликовал приложение в Play Маркете. Теперь он дает ошибку 500 Server, когда я пытаюсь опубликовать уведомление. Я не знаю, почему эта ошибка происходит. Возможно, приложение не собирает RavenDB, где хранятся уведомления? Но это больше похоже на то, что служба не возвращает пользователей, зарегистрированных на концентраторе. Я действительно не знаю ... Любая помощь будет так оценена!Исключение Null ссылки из концентраторов уведомлений Azure

Это мой StackTrace при запуске локально, это то же самое, но менее детализированным при публикации:

"Message": "An error has occurred.", 
"ExceptionMessage": "Value cannot be null.\r\nParameter name: source", 
"ExceptionType": "System.ArgumentNullException", 
"StackTrace": " at System.Linq.Enumerable.Where[TSource](IEnumerable`1 source, Func`2 predicate)\r\n 
at AcademicAssistantService.Controllers.NotificationController.<GetRecipientNamesFromNotificationHub>d__8.MoveNext() 
in C:\\Users\\Kenneth\\Documents\\College\\Semester 8\\AcademicAssistantService\\AcademicAssistantService\\Controllers\\NotificationController.cs:line 105 

Это действие контроллера:

// POST api/notification 
public async Task<IHttpActionResult> Post([FromBody]Notification notification, String key) 
{ 
    var notificationToSave = new Notification 
    { 
     NotificationGuid = Guid.NewGuid().ToString(), 
     TimeStamp = DateTime.UtcNow, 
     Message = notification.Message, 
     SenderName = notification.SenderName 
    }; 

    var recipientNames = await GetRecipientNamesFromNotificationHub(key); 

    var recipientNamesString = CreateCustomRecipientNamesString(recipientNames); 

    string notificationJsonPayload = 
     "{\"data\" : " + 
     " {" + 
     " \"message\": \"" + notificationToSave.Message + "\"," + 
     " \"senderName\": \"" + notificationToSave.SenderName + "\"," + 
     " \"recipientNames\": \"" + recipientNamesString + "\"" + 
     " }" + 
     "}"; 


    if (key == null) 
    { 
     var result = await _hubClient.SendGcmNativeNotificationAsync(notificationJsonPayload); 

     notificationToSave.TrackingId = result.TrackingId; 
     notificationToSave.Recipients = recipientNames; 
    } 
    else 
    { 
     foreach (string r in recipientNames) 
     { 
      if ((r != notification.SenderName)) 
      { 
       var result = await _hubClient.SendGcmNativeNotificationAsync(notificationJsonPayload, "user:" + r); 
       notificationToSave.TrackingId = result.TrackingId; 
       notificationToSave.Recipients = recipientNames; 
      } 
     } 
    } 

    await Session.StoreAsync(notificationToSave); 

    return Ok(notificationToSave); 
} 

Чтобы получить имена от хаба:

public async Task<List<string>> GetRecipientNamesFromNotificationHub(String key) 
{ 
    var registrationDescriptions = await _hubClient.GetAllRegistrationsAsync(Int32.MaxValue); 

    var recipientNames = new List<String>(); 
    foreach (var registration in registrationDescriptions) 
    { 
     if (registration is GcmRegistrationDescription) 
     { 
      var userName = registration.Tags 
              .Where(t => t.StartsWith("user")) 
              .Select(t => t.Split(':')[1].Replace("_", " ")) 
              .FirstOrDefault(); 
      userName = userName ?? "Unknown User"; 

      Conversation convo = db.Conversations.Find(key); 

      foreach (User u in convo.Users) 
      { 
       if (u.Email == userName && !recipientNames.Contains(userName)) 
       { 
        recipientNames.Add(userName); 
       } 
      } 
     } 
    } 
    return recipientNames; 
} 
+0

В соответствии с сообщением об ошибке, что вы вставили этот вопрос находится в вашем коде. Похоже, что это строка с '.Where (t => t.StartsWith (« пользователь »)). Возможно, нет элементов, которые начинаются с «пользователя» в вашей коллекции. Или коллекция пуста. –

+0

Во-первых, спасибо за отзыв! Дело в том, что в результатах есть элементы, и они начинаются с «пользователя» .. Кажется, что-то получилось, что-то, через возвращенные предметы, а затем бомбить по неизвестной причине! – semiColon

ответ

1

Не могли бы вы использовать Service Bus Explorer и убедиться, что у вас есть теги с "use р". И я также вижу, что вы используете API GetAllRegistrationsAsync, который рекомендуется использовать только для целей отладки. Это сильно дросселируемый API.

Спасибо, Sateesh

 Смежные вопросы

  • Нет связанных вопросов^_^