Я использую 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;
}
В соответствии с сообщением об ошибке, что вы вставили этот вопрос находится в вашем коде. Похоже, что это строка с '.Where (t => t.StartsWith (« пользователь »)). Возможно, нет элементов, которые начинаются с «пользователя» в вашей коллекции. Или коллекция пуста. –
Во-первых, спасибо за отзыв! Дело в том, что в результатах есть элементы, и они начинаются с «пользователя» .. Кажется, что-то получилось, что-то, через возвращенные предметы, а затем бомбить по неизвестной причине! – semiColon