我正在使用后台传输将照片上传到我的Web服务。由于照片上传会占用大量时间和内存,我认为使用后台传输请求来完成此操作可能是一个不错的主意。上传照片后,我想获取上传照片的ID,然后将其用于后期处理。但是,事实证明我无法在后台传输请求中执行此操作。
根据我的理解,Background Transfer仅使用以下逻辑:
您必须获取要上传的文件,然后将其保存/复制到文件夹下的应用程序的隔离存储:共享/传输。这非常重要。显然,在不同位置使用文件对我不起作用。也许它不是共享/转移,而是它是一条“相对”的道路。但我会坚持相同的惯例。
在该位置保存文件后,可以根据该位置创建后台请求。看起来你不能传递除文件内容之外的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服务返回刚刚上传的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的任何工作示例?
答案 0 :(得分:1)
没试过,但为什么不设置这样的下载位置:
btr.DownloadLocation = "myDownloadFile.html";
btr.UploadLocation = "myUploadFile.jpg";
...
如果请求已完成,请阅读存储响应的文件“myDownloadFile.html”,然后将其删除。