none
backgroundupload及streamreader的问题 RRS feed

  • 问题

  • 我在使用backgroundUpload上传文件之后想要得到服务器返回的信息,我的用法如下:

    using (Stream test = op.GetResultStreamAt(0).AsStreamForRead())
                                {
                                    UTF8Encoding encoding = new UTF8Encoding();
                                    using (StreamReader readStream = new StreamReader(test, encoding))
                                    {
                                        backStr = await readStream.ReadToEndAsync(); 
                                    }
                                }

    在执行backStr = await readStream.ReadToEndAsync(); 的时候会偶发异常,异常信息如下:

    An exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.dll but was not handled in user code

    Additional information: The system cannot find the file specified. (Exception from HRESULT: 0x80070002)

    在系统多并发执行此语句的时候产生异常的几率明显加大,且一旦产生一次此异常,之后再有执行到 readStream.ReadToEndAsync();的语句都会失败.

     

    我想问一下这是怎么回事,如何解决?

    或者提供另外一种可靠的获取uploadOperation的result信息的方法。

    2012年6月30日 8:24

全部回复

  • 采用下述方法也会引发 System.IO.FileNotFoundException 异常。

    IInputStream inputStream = op.GetResultStreamAt(0);
    DataReader DR = new DataReader(inputStream);
    await DR.LoadAsync(0x2800);
    string resultString = DR.ReadString(DR.UnconsumedBufferLength);

    有人知道是怎么回事吗?

    2012年7月2日 6:23
  • op.GetResponseInformation() 可以一次获得回复的Header和状态信息。

    针对你的问题,我想知道你的系统并发是否是通过 AttachAsync? 还有你的Response内容有多少?通常我们在server端仅需要返回一些比较简单的内容就足够告诉客户端上载的状态。

    基于例子:http://code.msdn.microsoft.com/windowsapps/Background-Transfer-Sample-d7833f61 你可以看到通过 FileOpenPicker 选择多个文件,然后基于AttachAsync 在一个 UploadOperation 中去实现多文件上载:

                try
                {
                    Progress<UploadOperation> progressCallback = new Progress<UploadOperation>(UploadProgress);
                    if (start)
                    {
                        // Start the upload and attach a progress handler.
                        await upload.StartAsync().AsTask(cts.Token, progressCallback);
                    }
                    else
                    {
                        // The upload was already running when the application started, re-attach the progress handler.
                        await upload.AttachAsync().AsTask(cts.Token, progressCallback);
                    }
                    ResponseInformation response = upload.GetResponseInformation();
                    Log(String.Format("Completed: {0}, Status Code: {1}", upload.Guid, response.StatusCode));
                }
                catch (TaskCanceledException)
                {
                    Log("Upload cancelled.");
                }
                catch (Exception ex)
                {
                    LogException("Error", ex);
                }


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us


    2012年7月2日 7:08
    版主
  • 感谢Bob的回复。

    我确实是参照了您所推荐的例子来使用的backgroundUpload。

    我需要将文件上传到skydrive空间,虽然使用op.GetResponseInformation()可以得知上传是否成功,但是我也需要op.GetResultStreamAt(0)来获得服务器返回的流,从流中读出服务器返回给我的文件的id和source信息,将流读成的string后的信息参考如下:

    "{\r   \"id\": \"file.a5a89ee26c2c13ea.A5A89EE26C2C13EA!4915\", \r   \"source\": \"http://storage.live.com/s1p53Pw0d_VsGKVVt5d4qYP-euuR-_TMDrf-qgvOLSAvuSonK7GemL3JOqAg4QiV6JJmp0PL0HVAvqMJetJAyq60LDXij0emEYE_bHKloS26zGVirarVx_ez_BQIpgShcqv/100_2856.JPG:HighRes,Default/100_2856.JPG\"\r}"

    每次长度都差不多如此,但是如我一开始所述,将IInputstream读取成stream的过程中会偶发异常“'System.IO.FileNotFoundException”,

    比较奇怪的,msdn上对于StreamReader .ReadToEndAsync()方法给出了三个可能抛出的异常,但是并没有我所遇到的这种而且此异常一旦发生,之后再调用如此代码都会产生异常,除非重新启动AP。

    总之谢谢您的答复,也希望您能再跟进一下我的问题。谢谢!


    • 已编辑 Ivan_Shi 2012年7月2日 12:56
    2012年7月2日 12:54
  • 上传文件到Skydrive用Live SDK做就可以了,并不需要我们自己来设计和控制。 参考看看这个帖子:  http://social.msdn.microsoft.com/Forums/zh-CN/metroappzhcn/thread/4eadb763-3323-49d8-a0d2-ca93f80aac17/


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年7月3日 9:24
    版主
  • 感谢Bob的回复。

    Live SDK是可以使用,也很方便。

    不过我在尝试着调用REST API来实现SDK的功能。

    2012年7月6日 8:42
  • 是这样子啊。

    好吧,不过我这里确实试了好几次也没有重现,最好是能够有你的这部分完整的代码,我这里来重现下,把问题范围缩小一点,我也可以去帮助你进一步咨询。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年7月9日 10:42
    版主