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

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

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

public void GetWordFrequencyResource(Action 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(); 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 ,但创建一个自定义集合类型,将它们保存在数组或List ,然后使用一些二进制搜索方法对其进行索引。

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

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

使用Silverlight 2调用Web服务

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

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

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