BackgroundTransferRequest WP7

Фотосуреттерді веб-қызметке жүктеу үшін Background Transfer функциясын қолданамын. Фотосурет жүктеуі маңызды уақытты және жадты жұмсау мүмкін болғандықтан, оны орындау үшін фондық тасымалдауды қолдану туралы жақсы идея болуы мүмкін деп ойладым. Фотосурет кері жүктелгеннен кейін жүктеп салынған фотосуреттің идентификаторын алуға және кейін оны өңдеу үшін пайдаланғым келеді. Дегенмен, фондық тасымалдау сұрауы бойынша мұны жасай алмаймын.

Менің түсінігім бойынша, Фонды көшіру тек келесі логика арқылы жұмыс істейді:

  1. Қотарып бергіңіз келетін файлды алуыңыз керек, содан кейін оны қалтаңыздағы бағдарламаңыздың оқшауланған қоймасына сақтаңыз/көшіріңіз: shared/transfers . Бұл өте маңызды. Шындығында, басқа жерде файлды пайдалану маған жұмыс істемеді. Мүмкін, бұл «салыстырмалы» жолы болғандықтан, ортақ/аударым емес. Бірақ мен сол конвенцияға ұстанатын едім.

  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(btr_TransferStatusChanged);
btr.TransferProgressChanged += new EventHandler(btr_TransferProgressChanged);

BackgroundTransferService.Add(btr);

Менің жағдайда, сұрау жолын пайдаланып, барлық қажетті параметрлерді тікелей айтамын. Сәтті сақтаған кезде, Веб-қызметім жаңа жүктеген фотосуреттің идентификаторын қайтарады. Алайда: RESPONSE-ды алу және бағалау үшін ешқандай жол жоқ (немесе кем дегенде мен білемін). Фонды ауыстыру сұрауы Оқиға өңдегіштері 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 жұмыс мысалдары бар ма?

2

1 жауаптар

Бұл әрекетті байқамаңыз, бірақ неге жүктеу орнына осындай орнатпау керек:

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

Егер сұрау аяқталған болса, сіздің жауапыңыз сақталған «myDownloadFile.html» файлын оқып шығыңыз және кейінірек оны жойыңыз.

1
қосылды
Қызықты көзқарас, егер мен дұрыс түсінсем, сіз файлды сақтағаннан кейін жауапты txt файлын жасауым керек деп айтасыз ба? Hmm. 100-ге тарта фотосуреттер жүктелсе, бұл қаншалықты жақсы болады деп ойлаймын.
қосылды автор Anup Marwadi, көзі
Мен Background Transfer қызметін пайдалану арқылы сынамын деп ойлаймын. Бұл жақсы идея сияқты емес. Мен өз жұмысымды жазамын, ол байтты оқшауланған сақтаудан веб-қызметке жазады, содан кейін процесс тоқтап қалса, ол қайтадан қайтадан іске қосылады. Майкрософт корпорациясының ешқайсысы бұл туралы жеткілікті түрде ойлаған жоқ.
қосылды автор Anup Marwadi, көзі
Мен сіздің идеямызға келісемін, бірақ жауап беру файлдары мен оларды басқаруға қосымша қаражат беру идеясы мен үшін өте тартымды емес. Алайда, сол тапсырма жүктеу/жүктеу мүмкіндігін береді. Жүктеуді жүзеге асыратын басқа тапсырманы жасауым керек болуы мүмкін. Мен сізді ұстап беремін.
қосылды автор Anup Marwadi, көзі
Сәлеметсіз бе, сізді бұл туралы жаңартқыңыз келді. UPLOAD және DOWNLOAD бірдей қоңырауда бір мезгілде орындауға болады деп ойламаймын, сондықтан жоғарыда айтқандарыңыз жұмыс істемейді. Сіздің пікіріңізге рахмет.
қосылды автор Anup Marwadi, көзі
Тек оны жаңартып отыру үшін: бұл «үстемдік» әдісін қолдану WP7/WP8-де BTS-ді жалғастырудың жалғыз жолы.
қосылды автор Léon Pelletier, көзі
Менің ойымша, бұл жауапты алудың жалғыз жолы => файлға жазу. Әрине, егер сізде бірнеше жүктемелер болса, файлдың бірегей файл атауы болуы керек (мысалы, файл атауы ретінде DateTime.Now.Ticks пайдалануды сұрауды бастау уақыты). Бұл жауап шығару файлы өте кішкентай, сондықтан ол өнімділік проблемаларын тудырмауы керек. Бұл сіз үшін жұмыс істей ме?
қосылды автор Rico Suter, көзі
Егер бұл жұмыс істейтін болса, онда мен үлкен пролемлем көрмеймін, бірақ жақсы.
қосылды автор Rico Suter, көзі