C# Silverlight根据需要从a';哑巴';服务器

C# Silverlight根据需要从a';哑巴';服务器,c#,.net,visual-studio,silverlight,silverlight-3.0,C#,.net,Visual Studio,Silverlight,Silverlight 3.0,我有一个文本文件,其中列出了300000个单词,以及它们出现的频率。每行的格式为Word:FequencyOfOccurence。 我希望可以从C#代码中访问此信息。我不能硬编码列表,因为它太长了,我不知道如何从服务器上的文件访问它。理想情况下,我希望信息只有在被使用时才被下载(以节省带宽),但这不是一个高优先级,因为文件不太大,互联网速度总是在增加。 它不需要用于绑定。 构建项目后,信息不需要编辑。您可以在服务器端创建WCF服务,将数据发送到Silverlight应用程序。一旦检索到信息,就可

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

您可以在服务器端创建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
}

根据您的评论,如果需要非常薄的服务器层,您可以下载单词列表文件。包含Silverlight应用程序的XAP文件只是一个ZIP文件,其中包含Silverlight客户端层的所有引用文件。尝试将单词列表添加为编译到XAP中的内容,并查看文件的大小。文本通常压缩得很好。不过,一般来说,您希望在应用程序占用的内存量方面对用户友好。将一个巨大的文本文件加载到内存中,再加上你在应用程序中需要的所有东西,可能会不定时地让你的应用程序成为资源霸主

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


最好将列表存储在SQL Server中。查询将更加容易和快捷

这里是另一种选择。将文件压缩并粘贴到应用程序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"));
 }
public void GetWordFrequencyResource(操作回调)
{
WebClient客户端=新的WebClient();
client.OpenReadAsync+=(s,args)=>
{
尝试
{
var zipRes=new StreamResourceInfo(args.Result,null)
var txtRes=Application.GetResourceStream(zipRes,新Uri(“WordFrequency.txt”,UriKind.Relative));
字符串结果=新建StreamReader(txtRes.Stream).ReadToEnd();
回调(结果);
}
抓住
{
回调(null);//获取失败。
} 
}
OpenReadAsync(新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.
var wordFrequency=newdictionary();
GetWordFrequencyResource(s=>
{
//这里的代码将字符串突发到字典中。
});
//注意这里的代码与字典的构建是异步的,不要试图
//使用这里的字典。
上面的代码允许您以高效的zip格式存储文件,但不能存储在XAP中。因此,您可以按需下载。它利用了XAP是一个zip文件的事实,因此
应用程序。GetResourceStream
可以在zip文件上使用,它旨在从XAP文件中提取资源


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

如果我找不到更好的选择,我会尝试,问题是我不希望在脚本等方面对服务器提出任何额外要求。我选择silverlight的原因之一是它不需要任何特殊功能(服务器端)托管。这同样适用于不希望托管web服务的理想情况,但是不要求它是文本文件,这只是数据现在所在的位置,我可以很容易地将其添加到SQL数据库中。由于此功能并不总是被使用,我想你是对的,它不应该在应用程序中编译(它为下载大小增加了约1.5MB)作为替代(以保持服务器端代码精简),我将使用System.Windows.Browser.HtmlPage.Window.Navigate允许用户手动下载一个文件。由于这只需要执行一次,所以不会有太大问题。@Tuskan360:这似乎是一个奇怪的选择,为什么不在需要时从Silverlight应用程序中使用WebClient下载它。配置缓存控制头rs正确,以避免重复下载。我第一次尝试时无法使其工作,但AnthonyWJones的代码工作正常,因此我现在使用它。替换:client+=(s,args)=>With:client.OpenReadCompleted+=(s,args)=>替换:var zipRes=new StreamResourceInfo(e.Result,null)With:var zipRes=new StreamResourceInfo(args.Result,null);别忘了用正确的文件名替换这两个文件名。否则就太完美了,非常感谢,因为这正是我想要的解决方案。@Tuskan360:经过相应的编辑,我快速地将其制作了一点。