【问题标题】:BackgroundTransferRequest WP7背景传输请求 WP7
【发布时间】:2012-01-04 03:59:05
【问题描述】:

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

据我了解,后台传输仅使用以下逻辑:

  1. 您必须获取要上传的文件,然后将其保存/复制到应用程序的独立存储文件夹下:shared/transfers。这是极其重要的。显然,在其他位置使用文件对我不起作用。也许它不是共享/传输,而是“相对”路径。但我会坚持同样的约定。

  2. 将文件保存到该位置后,可以基于该位置创建后台请求。除了文件内容之外,您似乎无法传递 POST CONTENT,因此文件名、mime 类型等任何其他参数都需要仅作为 QUERY String 参数传递。我可以理解这一点,但如果我可以将两者都作为 POST 内容传递,那就太好了。我不认为 HTTP 对其工作方式有限制。

下面是一些使用 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 服务会返回我刚刚上传的照片的 ID。然而: 没有办法(或至少我知道)获得和评估响应。后台传输请求事件处理程序不公开响应。 这是我的事件处理程序:

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 的工作示例?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 有趣的方法,如果我理解正确,你是说保存文件后,我应该创建一个带有响应的 txt 文件?唔。想知道当我上传 100 多张照片时,它会有多好。
    • 我认为这是获得响应的唯一方法 => 写入文件。当然,如果你有多个上传文件必须有一个唯一的文件名(例如使用请求开始时间DateTime.Now.Ticks 作为文件名)。此响应输出文件非常小,因此不会导致性能问题。它对你有用吗?
    • 我想我将使用后台传输服务报废。这似乎不是一个好主意。我想我会编写自己的处理程序,以便它从隔离存储向 Web 服务写入字节,然后如果进程中途停止,它将不得不重新开始。遗憾的是,微软没有人对此考虑得足够好。
    • 好吧,我同意你的想法,但是拥有响应文件和管理它们的额外开销的想法对我来说似乎不是很有吸引力。但是,我不知道同一任务是否允许上传/下载。我可能需要创建另一个运行下载的任务。我会及时通知你。
    • 您好,想更新您的信息。我认为您不能像这样在同一个调用中同时执行 UPLOAD 和 DOWNLOAD,因此您上面提到的内容将不起作用。不过感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    相关资源
    最近更新 更多