0

我对 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(它不会编译)。

我相当确定这是一个编码问题,但我不知道如何解决它。

4

1 回答 1

1

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

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

于 2013-10-11T07:27:43.223 回答