Async HttpWebRequest не удалось получить все запросы диапазона - PullRequest
1 голос
/ 05 октября 2010

Я пытаюсь получить URI по частям, устанавливая заголовок Range в моем HttpWebRequest, а затем запрашивая их асинхронно, используя Begin / EndGetResponse:

using System;
using System.Net;

namespace MultiGet
{
    class Program
    {        
        static void GetterCallback(IAsyncResult ip)
        {
            try
            {
                var req = (HttpWebRequest)ip.AsyncState;
                var response = req.EndGetResponse(ip);
                Console.WriteLine("In GetterCallback {0}",req.Headers["Range"]);
                response.Close();
            }
            catch
            {
                Console.WriteLine("Exception Thrown");
            }
        }

        static void Main(string[] args)
        {
            string URI = "http://www.microsoft.com";
            var req = (HttpWebRequest)WebRequest.Create(URI);
            req.Method = WebRequestMethods.Http.Head;
            var response = req.GetResponse();
            int TotalSize = Int32.Parse(response.Headers["Content-Length"]);

            Console.WriteLine("URI Content-Length {0}",TotalSize);
            Console.WriteLine("Now requesting the URI in 10 parts");                        

            Int32 start = 0;
            var splitreq = new HttpWebRequest[10];
            var results = new IAsyncResult[10];
            for (int i = 0; i < 10; i++)
            {
                Int32 end = start + TotalSize / 10 - 1;
                if (i == 9) end = TotalSize;

                splitreq[i] = (HttpWebRequest)WebRequest.Create(URI);
                splitreq[i].AddRange(start, end);             

                results[i] = splitreq[i].BeginGetResponse(new AsyncCallback(GetterCallback), splitreq[i]);

                start = end + 1;
            }
            Console.ReadKey(true);

            //This shows that some async calls did not complete
            foreach (var result in results)
            {
                Console.WriteLine(result.IsCompleted);                
            }

        }

    }
}

Даже если я долго жду (без нажатия клавиши Console.ReadKey (true)), все запросы не завершаются. Я не уверен, где я иду не так.

1 Ответ

1 голос
/ 05 октября 2010

Одной из возможных проблем является то, что вы не используете операторы using для ответов, поэтому возможно, что они держатся за HTTP-соединения в пуле.

Так, например, я предлагаю вам изменить свой обратный вызов на:

static void GetterCallback(IAsyncResult ip)
{
    try
    {
        var req = (HttpWebRequest)ip.AsyncState;
        using (var response = req.EndGetResponse(ip))
        {
            Console.WriteLine("In GetterCallback {0}",req.Headers["Range"]);
        }
    }
    catch
    {
        Console.WriteLine("Exception Thrown");
    }
}

И ранее в вашей программе, когда вы находите длину контента:

int TotalSize;
using (var response = (HttpWebResponse) req.GetResponse())
{                
    TotalSize = (int)response.ContentLength;
}

Когда вы внесете эти изменения, попробуйте еще раз ... это, безусловно, работает для меня.

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