HttpWebRequest & UploadProgressChanged? - PullRequest
       3

HttpWebRequest & UploadProgressChanged?

1 голос
/ 08 августа 2010

Как я могу использовать HttpWebRequest.BeginGetResponse и получать события с измененным прогрессом для загрузки метода POST?

Часть кода, который у меня сейчас есть:

HttpWebRequest req = (HttpWebRequest)WebRequestCreator.ClientHttp.Create(uploadUri);

req.Method = "POST";
req.ContentType = "multipart/form-data; boundary=" + boundary + "";

req.ContentLength = dataBuffer.Length;

req.AllowReadStreamBuffering = false;
req.AllowWriteStreamBuffering = false;

DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
    ProgressText = "Waiting for request stream...";
});

req.BeginGetRequestStream(new AsyncCallback(GotRequestStreamForUpload), new SendPhotoAsyncState(req, dataBuffer, photo));

Звонок на BeginGetResponse:

request.BeginGetResponse(new AsyncCallback(GotResponseStreamForUpload), new SendPhotoAsyncState(request, null, flickRPhoto));

Как я могу сказать, что хочу бытьуведомлен об изменениях в потоке?

Я хочу иметь возможность обновлять пользовательский интерфейс в зависимости от процесса загрузки фотографий ...

Следующий код не работает с WebClient:

       WebClient wc = new WebClient();

        wc.UploadStringCompleted += (s, e) =>
            {
                // What photo is this ?
                FlickRUploadPhoto fup = ((SendPhotoAsyncState)e.UserState).FlickrPhoto2Upload;
                DispatcherHelper.CheckBeginInvokeOnUI(() =>
                {
                    fup.tCompleted = DateTime.Now;
                    FileUploadComplete(this, new FlickRUploadCompleteEventArgs(fup));
                });

            };

        wc.UploadProgressChanged += (s2,e2) =>
            {

                // Was there an error ?

                // What photo is this ?
                FlickRUploadPhoto fup = ((SendPhotoAsyncState)e2.UserState).FlickrPhoto2Upload;
                DispatcherHelper.CheckBeginInvokeOnUI(() =>
                    {
                        fup.ProgressPercentage = e2.ProgressPercentage;
                        fup.ProgressPercentageString = e2.ProgressPercentage.ToString() + "%";
                        fup.BytesUploaded = e2.BytesSent;
                    });
            };


        string data = dataBuffer.ToString();
        wc.UploadStringAsync(uploadUri, "POST", data , new SendPhotoAsyncState(null, dataBuffer, photo));

Это Silverlight ... Так что я должен использовать UploadStringAsync ??

1 Ответ

2 голосов
/ 08 августа 2010

Вы не можете сделать это с HttpWebRequest, но вы можете сделать это с WebClient:

    public void Upload(string targetUri, string filePath)
    {
        WebClient client = new WebClient();
        client.UploadProgressChanged += new UploadProgressChangedEventHandler(client_UploadProgressChanged);
        client.UploadFile(targetUri, filePath);
    }

или UploadData, если у вас нет локального файла:

public void Upload(string targetUri, byte[] buffer)
    {
        WebClient client = new WebClient();
        client.UploadProgressChanged += new UploadProgressChangedEventHandler(client_UploadProgressChanged);
        client.UploadData(targetUri, buffer);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...