дождитесь завершения webrequest

#asp.net

#asp.net

Вопрос:

привет, эта функция загружает изображение из исходного кода и добавляет его в zip-файл. проблема в том, что иногда изображение выходит полностью испорченным (загружена 1/3, остальное пустое место), как будто загрузка не завершена. как я могу убедиться, что загрузка завершена, прежде чем двигаться дальше? Спасибо.

редактировать: у меня есть тайм-аут, поэтому он не будет ждать бесконечно. должен ли я просто продлить время ожидания? или есть способ получше?

 public void addImage(string source, string destination)
    {
        if (isFinalized)
            return;

        try
        {
            WebRequest req = WebRequest.Create(source);
            req.Timeout = 5000;

            WebResponse resp = req.GetResponse();
            BufferedStream reader = new BufferedStream(resp.GetResponseStream());

            byte[] fileData = new byte[resp.ContentLength];
            reader.Read(fileData, 0, fileData.Length);
            zip.AddEntry(destination, fileData);
        }
        catch (Exception exp)
        {
        }
    }
  

Комментарии:

1. Для начала избавьтесь от try / catch. Откуда вы знаете, что не видите исключений?

Ответ №1:

В вашем коде вам нужно проверить прочитанные байты и посмотреть, полностью ли вы получили свое изображение.

 int FinalRead = reader.Read(fileData, 0, fileData.Length);
bool fImageIsOk = FinalRead == resp.ContentLength ;
  

Также я настоятельно рекомендую деформировать BufferedStream с using

Я думаю, что пример кода на msdn содержит хороший пример.

Вот на чем вы должны сосредоточиться. Не пытайтесь получить доступ к одному вашему буферу. В конце вы можете проверить, полностью ли вы получили свою фотографию или нет. Вы также можете проверить, подключена ли другая часть к процессу IsClientConnected

 int numBytesToRead = receivedData.Length;

while (numBytesToRead > 0)
{
    // Read may return anything from 0 to numBytesToRead.
    int n = bufStream.Read(receivedData,0, receivedData.Length);
    // The end of the file is reached.
    if (n == 0)
        break;
    bytesReceived  = n;
    numBytesToRead -= n;
}