DeviceUniqueId и мобильная служба Azure

Проблема

У меня есть приложение для Windows Phone 8. Из приложения пользователи могут загружать фотографии, а затем добавлять запись в таблицу для обработки с помощью службы Azure Mobile. Одним из столбцов в таблице является DeviceId. Эта часть работает нормально.

В другом представлении люди могут загрузить список записей, которые они уже добавили. К сожалению, для некоторых пользователей это не работает, так как не возвращает никаких записей (я могу найти их записи в базе данных).

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

Вот как я получаю DeviceUniqueId:

byte[] myDeviceID = (byte[])Microsoft.Phone.Info.DeviceExtendedProperties.GetValue("DeviceUniqueId");
string DeviceIDAsString = Convert.ToBase64String(myDeviceID);

Вот как я добавляю новые записи: TimelapseBatch.DeviceId (первый параметр в конструкторе — строка)

var item = new TimelapseBatch(DeviceInfo.DeviceUniqueId, /*other properties go here*/);
await App.MobileService.GetTable<TimelapseBatch>().InsertAsync(item);

Как я запрашиваю службу

private readonly IMobileServiceTable<TimelapseBatch> batchesTable = App.MobileService.GetTable<TimelapseBatch>();
...
batches = await batchesTable.Where(t => t.DeviceId == DeviceInfo.DeviceUniqueId).ToListAsync();

var processed = batches.Where(t => t.StatusCode == (int)BatchStatus.Processed).OrderByDescending(t => t.Processed).Select(t => new Timelapse()
{
    Page = new Uri(t.PlayerUrl),
    Thumbnail = new Uri(t.ThumbnailUrl)
}).ToList();

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

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

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

ОБНОВЛЕНИЕ

Поэтому, когда я использую DeviceUniqueId от клиентов, у которых возникли проблемы, я могу воспроизвести проблему.

Кроме того, если я сделаю это так:

batches = await batchesTable.Take(200).ToListAsync();
batches = batches.Where(t => t.DeviceId == DeviceInfo.DeviceUniqueId).ToList();

Он заполняет партии, как и ожидалось. Однако, если я сделаю это (ниже), пакеты будут пустыми (я указал 200 для целей тестирования, так как записей меньше).

batches = await batchesTable.Take(200).Where(t => t.DeviceId == DeviceInfo.DeviceUniqueId).ToListAsync();

ОБНОВЛЕНИЕ 2

Похоже, что сравнение не выполняется, если DeviceId содержит знак «+». Если я сделаю

t.DeviceId.Substring(0,X) == DeviceInfo.DeviceUniqueId.Substring(0,X)

Где X - это позиция знака +, тогда он работает так, как ожидалось. Мой Бог. Теперь я отчаянно пытаюсь найти обходной путь.

ОБНОВЛЕНИЕ 3

Определение типа:

public enum BatchStatus
{
    QueuedUp = 0,
    Processed = 1,
    Error = 2,
}

public class TimelapseBatch
{
    public TimelapseBatch()
    {
        TimelapseId = String.Empty;
        DeviceId = String.Empty;
        ContainerUrl = String.Empty;
        VideoMp4Url = String.Empty;
        VideoWebmUrl = String.Empty;
        ThumbnailUrl = String.Empty;
        Uploaded = new DateTime(2000, 1, 1);
        Processed = new DateTime(2000, 1, 1);
        PlayerUrl = String.Empty;
    }

    public TimelapseBatch(string deviceId, string timelapseId, string containerUrl, int photosCount, int fps):this()
    {
        DeviceId = deviceId;
        ContainerUrl = containerUrl;
        TimelapseId = timelapseId;
        PhotosCount = photosCount;
        Fps = fps;
        StatusCode = (int) BatchStatus.QueuedUp;
        Uploaded = DateTime.Now;
    }

    public int Id { get; set; }
    public int StatusCode { get; set; }

    public string TimelapseId { get; set; }
    public string DeviceId { get; set; }
    public string ContainerUrl { get; set; }
    public int PhotosCount { get; set; }
    public int Fps { get; set; }
    public DateTime Uploaded { get; set; }


    public string VideoMp4Url { get; set; }
    public string VideoWebmUrl { get; set; }
    public string ThumbnailUrl { get; set; }
    public double VideoSize { get; set; }
    public DateTime Processed { get; set; }

    public string PlayerUrl { get; set; }
}

person Maxim    schedule 26.03.2013    source источник
comment
В настоящее время в таблице всего 200 строк. С 66 уникальным идентификатором устройства.   -  person Maxim    schedule 26.03.2013
comment
Можете ли вы сузить, где проблема происходит? Вы получаете нулевые результаты по переменной batches или по processed?   -  person carlosfigueira    schedule 27.03.2013
comment
Пока не знаю, жду одобрения обновления приложения. Кажется, это на batches один.   -  person Maxim    schedule 27.03.2013
comment
Это работает, когда вы запускаете на своем локальном ящике разработчика / эмуляторе?   -  person carlosfigueira    schedule 27.03.2013
comment
Я обновил свой пост с последними выводами.   -  person Maxim    schedule 27.03.2013
comment
Интересно... каков тип свойства DeviceId? Можете опубликовать определение типа?   -  person carlosfigueira    schedule 27.03.2013
comment
Это строка. И вот я еще раз обновил свой пост.   -  person Maxim    schedule 27.03.2013
comment
давайте продолжим это обсуждение в чате   -  person Maxim    schedule 27.03.2013


Ответы (1)


А теперь решение:

 batches = await batchesTable.Where(t => t.DeviceId == DeviceInfo.DeviceUniqueId.Replace("+", "%2B") || t.DeviceId == DeviceInfo.DeviceUniqueId).ToListAsync();

Мне пришлось вручную экранировать знак + как %2B. Добавлено дополнительное условие на случай, если команда Azure исправит ошибку.

person Maxim    schedule 27.03.2013
comment
Привет, Максим, эта ошибка была исправлена ​​в версии SDK, которая была выпущена несколько недель назад и может быть загружена с веб-сайта Windows Azure (0.2.5). Он существовал до предыдущей версии (0.2.4). Если вы обновите SDK с сайта windowsazure.com/en-us/downloads, это ошибка должна быть исправлена. - person carlosfigueira; 27.03.2013
comment
Спасибо, Карлос. Я скачаю его сегодня вечером. - person Maxim; 27.03.2013
comment
Карлос, я не вижу v0.2.5. Я скачал azuresdk-win8-v0.2.5.exe с сайта Azure. Он устанавливается в папку C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\ExtensionSDKs\MobileServicesManagedClient\0.2.0.0\References\CommonConfiguration\neutral, и единственная версия, которая у меня есть, это 0.2.0, когда я иду чтобы добавить новую ссылку. Nuget также показывает только 0.2.0. - person Maxim; 28.03.2013
comment
Версия на VS по-прежнему 0.2.0; у вас есть правильный пакет SDK (azuresdk-win8-v0.2.5.exe). В этой версии (или версии в NuGet) ошибка должна быть исправлена. - person carlosfigueira; 28.03.2013