WebRequest - асинхронный поиск данных для нескольких запросов - PullRequest
0 голосов
/ 01 сентября 2010

Код не является полным (он не создается), так как я не могу получить «элемент» в следующей строке в WriteResponseData ().

HttpWebResponse WebResp = (HttpWebResponse)item.EndGetResponse(result);

Я должен что-то упустить,Пожалуйста, укажите.

ниже приведен полный код: -

static string[] imageUris =
        { "http://www.cricinfo.com/db/PICTURES/CMS/118200/118217.2.jpg",
        "http://www.cricinfo.com/db/PICTURES/CMS/117500/117599.2.jpg",
        "http://www.cricinfo.com/db/PICTURES/CMS/117500/117598.2.jpg",
        "http://www.cricinfo.com/db/PICTURES/CMS/106400/106412.2.jpg",
        "http://www.cricinfo.com/db/PICTURES/CMS/106400/106411.2.jpg",
        "http://www.cricinfo.com/db/PICTURES/CMS/106200/106275.2.jpg",
        "http://www.cricinfo.com/db/PICTURES/CMS/106300/106362.2.jpg"
        };

        static void Main(string[] args)
        {
            SendAsynchronousRequests();
            Console.WriteLine("All the files have been requested and retrieved...");
            Console.ReadLine();
        }



static void SendAsynchronousRequests()
        {
            WebRequest[] requests = InitializeWebRequests();
            foreach (var item in requests)
            {
                Console.WriteLine("Trying to retrieve :-" + item.RequestUri.OriginalString);
                item.BeginGetResponse
                (
                   WriteResponseData,
                );
             }

        }

    static WebRequest[] InitializeWebRequests()
    {
        WebRequest[] requests = new WebRequest[imageUris.Length];
        int temp = 0;
        foreach (var item in imageUris)
        {
            requests[temp] = WebRequest.Create(item);
            //requests[temp].Method = "GET";
            temp++;
        }
        return requests;
    }
    static void WriteResponseData(IAsyncResult result)
    {
        HttpWebResponse WebResp = (HttpWebResponse)item.EndGetResponse(result);
        Console.WriteLine("WebResp.StatusCode :-" + WebResp.StatusCode);
        Console.WriteLine("WebResp.Server :- " + WebResp.Server);
        Console.WriteLine("WebResp.ContentLength :- " + WebResp.ContentLength.ToString());
        Console.WriteLine(Environment.NewLine);

    }

РЕДАКТИРОВАТЬ

Итак, модифицированный код для метода (который будетcompile) будет выглядеть следующим образом: -

WebRequest request = (WebRequest)result.AsyncState;
            if (result != null && result.IsCompleted)
            {
                HttpWebResponse WebResp = (HttpWebResponse)request.EndGetResponse(result);
                Console.WriteLine("WebResp.StatusCode :-" + WebResp.StatusCode);
                Console.WriteLine("WebResp.Server :- " + WebResp.Server);
                Console.WriteLine("WebResp.ContentLength :- " + WebResp.ContentLength.ToString());
                Console.WriteLine(Environment.NewLine);
            }

Это дает мне следующую ошибку времени выполнения: -

Ссылка на объект не установлена ​​на экземпляр объекта.в WebRequestUsingAPM.Program.WriteResponseData (результат IAsyncResult) в \ WebRequestUsingAPM \ Program.cs: строка 73 в System.Net.LazyAsyncResult.Complete (IntPtr userToken) в System.Net.ContextAwareResult.CompleteExject.Net.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логическое ignoreSyncCtx) в System.Threading.ExecutionContext.Run (обратный вызов ExecutionContext, состояние объекта) в System.Net.ContextAwareResult.Complete (IntPt.) System.Net.LazyAsyncResult.ProtectedInvokeCallback (результат объекта, IntPtr userToken) в System.Net.HttpWebRequest.ProcessResponse ()

РЕДАКТИРОВАТЬ: - Я понял.result.AsyncState возвращает ноль, потому что я передаю ноль, когда я вызываю BeginGetResponse (), вторым аргументом является AsyncState, и я передаю ноль там.Я должен передать текущий объект WebRequest туда, и это будет делать.

Итак, вместо следующего: -

item.BeginGetResponse
                    (
                       WriteResponseData, null
                    );

Я должен передать элемент: -

item.BeginGetResponse
                        (
                           WriteResponseData, item
                        );

1 Ответ

1 голос
/ 01 сентября 2010

Как вы сказали, этот код не будет компилироваться просто потому, что метод WriteResponseData не будет иметь ссылку на объект item. Вы можете использовать передать свой объект запроса в качестве состояния при вызове запроса на начало. См. этот пример кода из MSDN.

Редактировать: упрощенный шаблон кода будет

   item.BeginGetResponse(WriteResponseData, item);

И измените WriteResponseData как

static void WriteResponseData(IAsyncResult result)
{
    WebRequest request = (WebRequest)result.AsyncState;
    WebResponse response = request.EndGetResponse(result);
    ....
}
...