Асинхронная загрузка с использованием HttpWebRequest - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть приложение dot net windows, которое загружает большие файлы на сайт интрасети.Пока загрузка работает нормально, я также хотел бы знать, как происходит ее загрузка.

Я вижу, что webRequest.GetResponse () - это строка, которая требует времени.Элемент управления только что вышел из GetRequestStream почти сразу, и я предполагаю, что это происходит локально и не требует подключения к серверу.

using (var reqStream = webRequest.GetRequestStream())
{
    reqStream.Write(tempBuffer, 0, tempBuffer.Length);
}

Я попытался преобразовать его в асинхронный вызов, но он также занимает то же времядостичь метода RespCallback.

IAsyncResult result = (IAsyncResult)webRequest.BeginGetResponse(new AsyncCallback(RespCallback), requestState);

private void RespCallback(IAsyncResult asyncResult)
{
    WebRequestState reqState = ((WebRequestState)(asyncResult.AsyncState));
}

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

Ответы [ 2 ]

0 голосов
/ 06 апреля 2011

Думайте об асинхронной загрузке как об отдельном потоке, как только он загрузит информацию, запустится остальная часть программы и обработчик событий сработает после получения ответа.

Вы должны использовать WebClient класс.

Так, например:

public string result; //Variable for returned data to go.

public void UploadInfo(string URL, string data)
{

WebClient client = new WebClient(); //Create new instance of WebClient

client.UploadStringCompeleted += new UploadStringCompletedEventHandler(client_uploadComplete); //Tell client what to do once upload complete

client.UploadStringAsync(new uri(URL), data); //Send data to URL specified

}


public void client_uploadComplete(object sender, UploadStringCompletedEventArgs e)
{

if (e.Error == null) //If server does not return error
{
result = e.Result; //Place returned value into "result" string
}

}

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

Если вы используете какой-то формат обмена данными на стороне сервера, например, json, вам потребуется следующая строка, прежде чем отправлять информацию на сервер.

client.Headers[HttpRequestHeader.ContentType] = "application/json"; 

убедитесь, что вы изменили "application / json" на то, что вы используете.

Удачи!

0 голосов
/ 06 апреля 2011

Вы пробовали WebClient класс? И методы UploadXXXAsyn ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...