Как сделать завершенное событие, как в WebClient, но с помощью HttpWebRequest?

1

Я работал с Webclient, а WebClient - с завершением загрузки файла. Но теперь я использую этот метод:

private static void FileDownload(string uri, string fileName)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.AllowAutoRedirect = false;
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            if ((response.StatusCode == HttpStatusCode.OK ||
                response.StatusCode == HttpStatusCode.Moved ||
                response.StatusCode == HttpStatusCode.Redirect) &&
                response.ContentType.StartsWith("image", StringComparison.OrdinalIgnoreCase))
            {

                using (Stream inputStream = response.GetResponseStream())
                using (Stream outputStream = File.OpenWrite(fileName))
                {
                    byte[] buffer = new byte[4096];
                    int bytesRead;
                    do
                    {
                        bytesRead = inputStream.Read(buffer, 0, buffer.Length);
                        outputStream.Write(buffer, 0, bytesRead);
                    } while (bytesRead != 0);
                }
            }
        }

Дает WebRequest, WebResponse или, может быть, Stream имеет нечто вроде завершенного события? Так что если файл загружен, я могу делать что-то? Подобно событию загрузки файла WebClient.

Редактировать:

Я пытаюсь использовать асинхронный способ, поэтому я сделал это до сих пор:

HttpWebRequest request;
        void FileDownload(string uri, string fileName)
        {
            request = (HttpWebRequest)WebRequest.Create(uri);
            request.AllowAutoRedirect = false;
            request.BeginGetResponse(new AsyncCallback(FinishWebRequest), null);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            if ((response.StatusCode == HttpStatusCode.OK ||
                response.StatusCode == HttpStatusCode.Moved ||
                response.StatusCode == HttpStatusCode.Redirect) &&
                response.ContentType.StartsWith("image", StringComparison.OrdinalIgnoreCase))
            {

                using (Stream inputStream = response.GetResponseStream())
                using (Stream outputStream = File.OpenWrite(fileName))
                {
                    byte[] buffer = new byte[4096];
                    int bytesRead;
                    do
                    {
                        bytesRead = inputStream.Read(buffer, 0, buffer.Length);
                        outputStream.Write(buffer, 0, bytesRead);
                    } while (bytesRead != 0);
                }
            }

        }

А потом:

        void FinishWebRequest(IAsyncResult result)
        {
            request.EndGetResponse(result);

            if (!result.IsCompleted)
            {
            }
        }

Проблема в том, что в этой части: response.ContentType ContentType пуст "", поэтому он не вводит и не загружает файл.

Это произошло до того, как я изменил/добавил request.BeginGetResponse (новый AsyncCallback (FinishWebRequest), null); и FinishWebRequest.

  • 0
    Я думаю, что вы должны смотреть на асинхронные вызовы HttpWebResponse, например stackoverflow.com/questions/202481/…
  • 0
    Это действительно плохая идея, чтобы получить ответ, а не потреблять его. Вы должны, по крайней мере, вызвать request.Abort() и response.Dispose() если вы решили пропустить чтение ответа.
Показать ещё 1 комментарий
Теги:
winforms

1 ответ

0

В конце концов я сделал это так:

HttpWebRequest request;
        void fileDownloadRadar(string uri, string fileName)
        {
            request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(uri);
            request.CookieContainer = new CookieContainer();
            request.AllowAutoRedirect = true;

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            if (response.ContentType == "")
            {
                Logger.Write("ContentType is Empty download was not fine !!!!!");
            }
            if ((response.StatusCode == HttpStatusCode.OK ||
                response.StatusCode == HttpStatusCode.Moved ||
                response.StatusCode == HttpStatusCode.Redirect) &&
                response.ContentType.StartsWith("image", StringComparison.OrdinalIgnoreCase))
            {
                Logger.Write("ContentType is not empty meaning download is fine");
                using (Stream inputStream = response.GetResponseStream())
                using (Stream outputStream = File.OpenWrite(fileName))
                {
                    byte[] buffer = new byte[4096];
                    int bytesRead;
                    do
                    {
                        bytesRead = inputStream.Read(buffer, 0, buffer.Length);
                        outputStream.Write(buffer, 0, bytesRead);
                    } while (bytesRead != 0);

                }
                FinishWebRequest();
            }
            else
            {
                timer1.Stop();
                timer3.Start();
            }
        }

Это не async, как я хотел, но он работает идеально, как мне нужно. Может быть, я буду использовать фонового работника, но это работает так, как мне нужно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню