Я работал с 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.
В конце концов я сделал это так:
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, как я хотел, но он работает идеально, как мне нужно. Может быть, я буду использовать фонового работника, но это работает так, как мне нужно.
request.Abort()
иresponse.Dispose()
если вы решили пропустить чтение ответа.