Silverlight Загрузка справочных данных по запросу с «тупого» сервера - PullRequest
4 голосов
/ 14 февраля 2010

У меня есть текстовый файл со списком 300 000 слов и частотой, с которой они встречаются. Каждая строка имеет формат Word: FequencyOfOccurence. Я хочу, чтобы эта информация была доступна из кода C #. Я не могу жестко закодировать список, так как он слишком длинный, и я не уверен, как получить доступ к нему из файла на сервере. В идеале мне бы хотелось, чтобы информация загружалась только в том случае, если она используется (для экономии пропускной способности), но это не является высоким приоритетом, поскольку файл не слишком большой, а скорость интернета постоянно увеличивается. Это не должно быть полезным для привязки. Информация не должна быть редактируемой после создания проекта.

Ответы [ 3 ]

2 голосов
/ 15 февраля 2010

Вот еще одна альтернатива. Заархивируйте файл и вставьте его в папку clientBin рядом с приложением XAP. Затем в той точке приложения, где требуется контент, сделайте что-то вроде этого: -

 public void GetWordFrequencyResource(Action<string> callback)
 {
     WebClient client = new WebClient();
     client.OpenReadAsync += (s, args) =>
     {
       try
       {
         var zipRes = new StreamResourceInfo(args.Result, null)
         var txtRes = Application.GetResourceStream(zipRes, new Uri("WordFrequency.txt", UriKind.Relative));
         string result = new StreamReader(txtRes.Stream).ReadToEnd();

         callback(result);
       }
       catch
       {
         callback(null);  //Fetch failed.
       } 

     }
     client.OpenReadAsync(new Uri("WordFrequency.zip", UriKind.Relative"));
 }

Использование: -

 var wordFrequency = new Dictionary<string, int>();
 GetWordFrequencyResource(s =>
 {
    // Code here to burst string into dictionary.
 });
 // Note code here is asynchronous with the building of the dictionary don't attempt to 
 // use the dictionary here.

Приведенный выше код позволяет хранить файл в эффективном формате zip, но не в самом XAP. Следовательно, вы можете скачать его по требованию. В нем используется тот факт, что XAP является zip-файлом, поэтому Application.GetResourceStream, предназначенный для извлечения ресурсов из XAP-файлов, можно использовать в zip-файле.

Кстати, я не предлагаю вам использовать словарь, я просто использую словарь в качестве простого примера. На самом деле, я думаю, что файл в отсортированном порядке. Если это так, вы можете использовать KeyValuePair<string, int> для каждой записи, но создать собственный тип коллекции, который хранит их в массиве, или List, а затем использовать некоторые методы двоичного поиска для индексации в нем.

0 голосов
/ 14 февраля 2010

Исходя из ваших комментариев, вы можете загрузить файл списка слов, если вам нужен очень тонкий слой сервера. Файл XAP, содержащий ваше приложение Silverlight, представляет собой не более чем ZIP-файл со всеми ссылочными файлами для вашего клиентского слоя Silverlight. Попробуйте добавить список слов в качестве содержимого, которое компилируется в XAP, и посмотрите, насколько большим становится файл. Текст обычно сжимается очень хорошо. Тем не менее, в общем, вы захотите дружить со своими пользователями в том, сколько памяти использует ваше приложение. Загрузка огромного текстового файла в память, в дополнение ко всему, что вам нужно в вашем приложении, может привести к тому, что ваше приложение станет источником лишних ресурсов.

В целом, лучше всего вызывать веб-сервис. Служба может выполнить любую необходимую вам логику поиска. Вот запись блога из быстрого поиска, которая должна помочь вам начать: (Это было написано для SL2, но должно применяться также и для SL3.)

Вызов веб-сервисов с Silverlight 2

Еще лучше было бы сохранить ваш список на SQL Server. Это будет намного проще и быстрее для запроса.

0 голосов
/ 14 февраля 2010

Вы можете создать службу WCF на стороне сервера, которая будет отправлять данные в приложение Silverlight. Получив информацию, вы можете кэшировать ее в памяти внутри клиента. Вот пример вызова метода службы WCF из Silverlight.

Другая возможность - внедрить текстовый файл в сборку Silverlight, развернутую на клиенте:

using (var stream = Assembly.GetExecutingAssembly()
                            .GetManifestResourceStream("namespace.data.txt"))
using (var reader = new StreamReader(stream))
{
    string data = reader.ReadToEnd();
    // Do something with the data
}
...