无法在Silverlight中下载.pdf文件

时间:2013-10-11 07:09:32

标签: c# silverlight encoding webclient-download

我是Silverlight的新手。我试图在Silverlight中下载.pdf文件(以及其他几种格式)。用户单击一个按钮,系统将获取URI,然后显示SaveFileDialog以获取保存文件的位置。这是一段代码:

WebClient wc = new WebClient();
wc.DownloadStringCompleted += (s, e3) =>
{
    if (e3.Error == null)
    {
        try
        {
            byte[] fileBytes = Encoding.UTF8.GetBytes(e3.Result);
            using (Stream fs = (Stream)mySaveFileDialog.OpenFile())
            {
                fs.Write(fileBytes, 0, fileBytes.Length);
                fs.Close();

                MessageBox.Show("File successfully saved!");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error getting result: " + ex.Message);
        }
    }
    else
    {
        MessageBox.Show(e3.Error.Message);
};

wc.DownloadStringAsync("myURI", UriKind.RelativeOrAbsolute));

文件保存正常,但它大约是原始文件的两倍,并且不可读。 e3.Result看起来正确的大小(5Mb),但我怀疑它包含许多无关的字符。 FileBytes似乎大约两倍(11Mb)。我想尝试DownloadDataAsync而不是DownloadStringAsync(希望它能解决任何编码问题),但Silverlight有一个非常简化的System.Net.WebClient版本,不支持DownloadDataAsync(它不会编译)。

我很确定这是一个编码问题,但我看不出如何绕过它。

1 个答案:

答案 0 :(得分:1)

PDF文件是二进制文件,不使用UTF8编码。要使用Silverlight下载PDF文件,您需要使用WebClient类的OpenReadAsync方法开始下载文件的二进制数据,而不是DownloadStringAsync方法,因为您似乎是做。

您应该处理DownloadStringCompleted事件而不是处理OpenReadCompleted事件,并将接收到的字节写入本地PDF文件的流。如果您将AllowReadStreamBuffering设置为true,则仅在下载整个文件时触发OpenReadCompleted事件,并为您提供与DownloadStringCompleted相同的行为。但是,整个PDF文件将被缓存在内存中,如果文件非常大,这可能是一个坏主意。