Silverlight从'哑'服务器加载参考数据点播

时间:2010-02-14 17:30:01

标签: c# .net visual-studio silverlight silverlight-3.0

我有一个文本文件,其中包含300,000个单词的列表以及它们出现的频率。每行的格式为Word:FequencyOfOccurence。 我希望可以从C#代码中访问此信息。我不能硬编码列表,因为它太长了,我不知道如何从服务器上的文件访问它。理想情况下,我理想情况下只有在使用时才能下载信息(节省带宽)但这不是一个高优先级,因为文件不是太大而且互联网速度总是在增加。 它不需要用于绑定。 一旦项目建成,就不需要编辑信息。

3 个答案:

答案 0 :(得分:2)

这是另一种选择。压缩文件并将其粘贴在应用程序XAP旁边的clientBin文件夹中。然后在应用程序中需要内容的位置执行以下操作: -

 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文件这一事实,因此可以在zip文件中使用旨在从XAP文件中提取资源的Application.GetResourceStream

顺便说一句,我实际上并没有建议你使用字典,我只是用字典作为简单的例子。实际上我会想象文件是按顺序排列的。如果是这种情况,您可以为每个条目使用KeyValuePair<string, int>,但创建一个自定义集合类型,将它们保存在数组或List中,然后使用一些二进制搜索方法对其进行索引。

答案 1 :(得分:0)

您可以在服务器端创建一个WCF服务,该服务将数据发送到Silverlight应用程序。一旦检索到信息,就可以将其缓存在客户端内部。这是从Silverlight调用WCF服务方法的an example

另一种可能性是将文本文件嵌入到部署到客户端的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
}

答案 2 :(得分:0)

根据您的评论,如果您需要拥有非常薄的服务器层,可以下载单词列表文件。包含Silverlight应用程序的XAP文件只不过是一个ZIP文件,其中包含Silverlight客户端层的所有引用文件。尝试将单词列表添加为编译到XAP中的内容,并查看文件的大小。文本通常压缩得很好。但是,一般情况下,您希望与用户保持对应用程序消耗的内存的友好程度。将大量文本文件加载到内存中,除了应用程序中所需的所有内容之外,还可以使您的应用程序成为资源耗尽的。

一般来说,更好的做法是调用Web服务。该服务可以执行您需要的任何查找逻辑。这是一篇快速搜索的博客文章,应该可以帮助您入门:(这是为SL2编写的,但应该对SL3应用相同的内容。)

Calling web services with Silverlight 2

更好的方法是将列表存储在SQL Server中。查询会更容易,更快捷。