2011-10-29 6 views
2

バックグラウンド転送を使用してWebサービスに写真をアップロードしています。写真のアップロードはかなりの時間とメモリを消費する可能性があるため、これを達成するためにバックグラウンド転送要求を使用することをお勧めします。写真がアップロードされた後、アップロードされた写真のIDを取得し、後処理に使用したいと考えています。しかし、私はバックグラウンド転送要求でそれを行うことはできません。あなたがアップロードして保存/フォルダの下に、アプリケーションの分離ストレージにコピーしたいファイルを入手する必要がBackgroundTransferRequest WP7

  1. :私の理解パー

    は、バックグラウンド転送はONLY次のロジックを使用して動作します共有/転送。これは非常に重要です。どうやら、別の場所にあるファイルを使っても私にとってはうまくいきませんでした。多分、それは「相対的な」経路であるのと同じくらい、共有されている/移っていないでしょう。しかし、私は同じ慣習に固執します。

  2. その場所にファイルを保存した後、それに基づいてバックグラウンド要求を作成できます。ファイル内容以外のPOST CONTENTを渡すことはできないように見えるので、ファイル名やMIMEタイプなどの他のパラメータは、QUERY文字列パラメータとして渡す必要があります。私はこれを理解することができますが、POSTコンテンツとして両方を渡すことができればいいと思います。私は、HTTPがこれがどのように機能するかに制限があるとは思わない。ここで

はハンモックを使用して要求を作成するためのいくつかのコードです:私の場合は

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を返します。しかし: 回答を取得して評価する方法はありません(少なくとも私が知っている)。バックグラウンド転送要求イベントハンドラは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

はそれを試していないが、なぜこのようにダウンロード場所を設定していない:要求が完了した場合

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

あなたの応答を保存し、後でそれを削除されたファイル「myDownloadFile.html」をお読みください。

+0

私が正しく理解していれば、ファイルを保存した後、応答があるtxtファイルを作成する必要があります。うーん。私は100秒の写真アップロードが行われているときにこれがどのくらいうまく座るのだろうかと思っています。 –

+0

これは、応答を得る唯一の方法だと思う=>ファイルに書き込みます。もちろん、複数のアップロードがある場合、そのファイルは一意のファイル名でなければなりません(たとえば、ファイル名として要求開始時刻 'DateTime.Now.Ticks'を使用します)。この応答出力ファイルは非常に小さいため、パフォーマンス上の問題は発生しません。それはあなたのために働いていますか? –

+0

バックグラウンド転送サービスを使用してスクラップするつもりだと思います。これは良い考えのようには見えません。私は、独立したストレージからバイトをWebサービスに書き込むように自分のハンドラを作成し、プロセスが途中で停止した場合は、すべてをもう一度やり直す必要があります。マイクロソフト社の誰もこれについて十分に考えなかったことは悲しい。 –