BackgroundTransferRequest WP7

时间:2011-10-29 00:24:23

标签: windows-phone-7 wcf-web-api

我正在使用后台传输将照片上传到我的Web服务。由于照片上传会占用大量时间和内存,我认为使用后台传输请求来完成此操作可能是一个不错的主意。上传照片后,我想获取上传照片的ID,然后将其用于后期处理。但是,事实证明我无法在后台传输请求中执行此操作。

根据我的理解,Background Transfer仅使用以下逻辑:

  1. 您必须获取要上传的文件,然后将其保存/复制到文件夹下的应用程序的隔离存储:共享/传输。这非常重要。显然,在不同位置使用文件对我不起作用。也许它不是共享/转移,而是它是一条“相对”的道路。但我会坚持相同的惯例。

  2. 在该位置保存文件后,可以根据该位置创建后台请求。看起来你不能传递除文件内容之外的POST CONTENT,因此任何其他参数如文件名,mime类型等都只需要作为QUERY String参数传递。我可以理解这一点,但如果我可以将两者都作为POST内容传递,那将会很好。我不认为HTTP对其工作方式有限制。

  3. 以下是使用Hammock创建请求的一些代码:

    string url = App.ZineServiceAuthority + "articles/save-blob?ContainerName={0}&MimeType={1}&ZineId={2}&Notes={3}&IsPrivate={4}&FileName={5}";
    url = String.Format(url, userId, "image/jpg", ZineId, txtStatus.Text, true, UploadFileName);
    
    var btr = new BackgroundTransferRequest(new Uri(url, UriKind.Absolute));
    btr.TransferPreferences = TransferPreferences.AllowCellularAndBattery;
    btr.Method = "POST";
    btr.Headers.Add("token", IsolatedStorageHelper.GetTravzineToken());
    btr.UploadLocation = new Uri(@"/shared\transfers/" + UploadFileName, UriKind.Relative);
    btr.TransferStatusChanged += new EventHandler<BackgroundTransferEventArgs>(btr_TransferStatusChanged);
    btr.TransferProgressChanged += new EventHandler<BackgroundTransferEventArgs>(btr_TransferProgressChanged);
    
    BackgroundTransferService.Add(btr);
    

    就我而言,我实际上是使用查询字符串传递所有必要的参数。在成功保存后,我的Web服务返回刚刚上传的Photo的Id。然而: 没有办法(或者至少我知道)获得和评估反应。后台传输请求事件处理程序不公开RESPONSE。 以下是我的事件处理程序:

    void btr_TransferProgressChanged(object sender, BackgroundTransferEventArgs e)
    {
        bool isUploading = e.Request.TotalBytesToSend > 0 ? true : false;
        lblStatus.Text = isUploading ? "Uploading" + e.Request.BytesSent.ToString() + " sent" : "Done";
    }
    
    void btr_TransferStatusChanged(object sender, BackgroundTransferEventArgs e)
    {
        if (e.Request.TransferStatus == TransferStatus.Completed)
        {
    
            using (IsolatedStorageFile iso =
                   IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (iso.FileExists(e.Request.UploadLocation.OriginalString))
                    iso.DeleteFile(e.Request.UploadLocation.OriginalString);
            }
    
            BackgroundTransferService.Remove(e.Request);
    
            if (null != e.Request.TransferError)
            {
                MessageBox.Show(e.Request.TransferError.Message);
            }
            else
            {
                lblStatus.Text = "Done baby done";
            }
    
        }
    }
    

    所以现在我的问题是,在这种情况下,怎么做任何类型的POST处理? 谁能告诉我设计这样一个不灵活的课程背后的思路? 任何关于我如何解决这个问题的想法将不胜感激。

    此外,是否有人有本土BackgroundTransfer的任何工作示例?

1 个答案:

答案 0 :(得分:1)

没试过,但为什么不设置这样的下载位置:

btr.DownloadLocation = "myDownloadFile.html";
btr.UploadLocation = "myUploadFile.jpg";
...

如果请求已完成,请阅读存储响应的文件“myDownloadFile.html”,然后将其删除。