2011-07-20 70 views
0

我在我的Silverlight应用程序中有一个类(de-)将JSON字符串序列化到/来自对象类。 我用WebClient.OpenReadAsync获得包含此JSON字符串文件:WebClient.OpenReadAsync()损坏JSON数据。为什么?

{"FirstName":"Bob","LastName":"Underwood"} 

调用OpenReadAsync但是后,返回的字符串有很多多余的字符:

"PK\n\0\0\0\0\0�u�>h��5\0\0\05\0\0\0\t\0\0\0test.json\"{\\\"FirstName\\\":\\\"Gary\\\",\\\"LastName\\\":\\\"MacDonald\\\"}\"PK\0\n\0\0\0\0\0�u�>h��5\0\0\05\0\0\0\t\0\0\0\0\0\0\0\0\0 \0\0\0\0\0\0\0test.jsonPK\0\0\0\0\0\07\0\0\0\\\0\0\0\0\0" 

这是我的代码使用下载JSON:

WebClient client = new WebClient(); 
client.OpenReadCompleted += client_OpenReadCompleted; 
client.OpenReadAsync(new Uri("/someJsonFile.zip", UriKind.Relative)); 

void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) { 
    if (e.Error == null) { 
     StreamReader reader = new StreamReader(e.Result); 
     string jsonString = reader.ReadToEnd().ToString(); 
    } 
    else { 
     addMessage("Error " + e.Error.ToString()); 
    } 
} 

jsonString结束了所有额外的数据,所以我不能反序列化它。

另一件事要注意:URI指向someJsonFile.zip,但它确实没有拉上,当我给文件扩展名像.json,或没有扩展名,我得到一个错误,它无法找到文件,但是当我给它像.zip这样的扩展,它发现它很好。有没有一种方法可以使用正常或无延期?我想知道这是否是配置问题。

问题:

  1. 我做得不对拉动该文件并使用StreamReader拿到这是造成我让所有的垃圾数据串?

  2. 我是否需要做一些特定的事情才能使用WebClient来获取具有不同扩展名的文件,如.json,甚至根本没有扩展名?

+1

所有这些问题都来自您的Web服务器。 – SLaks

+0

...除了你没有在'reader.Dispose()'上执行任何操作!你应该把它放在一个'using'块中,例如''使用(StreamReader reader = ...){...}'。 – stakx

回答

3

1 - 即数据流肯定是ZIP(PK是旧的PKZip标记和test.json文件名在其索引中所提及)。

您的服务器可能会设置为提供所有压缩文件(或者您可能只是访问实际的zip文件)。请检查服务器设置。

2至于第二个问题,WebClient不关心文件类型。它只是一个需要用知道数据(即你的代码)的东西来解释的数据流。

它只是可以配置为以不同方式提供不同文件的服务器。

+0

我会看看,我知道这是我上传的一个文本文件,因为我将它从test.json重命名为test.zip,然后在代码中更改了uri以反映.zip而不是.json只是为了测试if它会起作用,而且确实如此。我也尝试过没有任何扩展,到目前为止只有renaing到.zip工作。我实际上并不介意只是压缩文件,只是想了解扩展是否重要,我会问我的提供商是否有任何设置。这是一个很好的提示,服务器可能会设置为服务所有压缩的文件,这可能是很好的。我会看看,谢谢你的方向。 – Terco

+0

嗯,我压缩了我的文件,在用webclient取回并解压后,我得到:“\”\\\“FirstName \\\”:\\\“Gary \\\”,\\\“LastName \\ \“:\”MacDonald \\\“} \”“ 这比以前更好,但仍然有很多额外的斜杠。我已经在我的域名中添加了一张票,看看我在做什么以及他们的配置是否应该有任何问题。 – Terco

+0

问:如果你不希望它是一个zip文件,为什么你首先使用.zip扩展名? –

0

我能够通过我的域名提供商了解情况,似乎在他们的最后有一些配置问题。