HttpWebRequest múltiple en bucle?

.net c# html-agility-pack httpwebrequest

Pregunta

Tengo que llamar al servicio web varias veces (en bucle), el problema es que mi código siempre devuelve un objeto vacío (Descripción de la imagen) y no se ejecuta correctamente cuando lo probé por separado (fuera de bucle) funcionó normalmente

Aquí está mi porción de código

HttpWebRequest httpReq = (HttpWebRequest)HttpWebRequest.Create(new Uri(imageCollection[i].ImageTag));

            httpReq.BeginGetResponse(new AsyncCallback((iar) =>
             {
                 try
                 {
                     string strResponse = "";
                     var response = (HttpWebResponse)((HttpWebRequest)iar.AsyncState).EndGetResponse(iar);

                     Stream stream = response.GetResponseStream();
                     StreamReader reader = new StreamReader(stream);
                     strResponse = reader.ReadToEnd();

                     HtmlDocument htmlDocument = new HtmlDocument();
                     htmlDocument.OptionFixNestedTags = true;
                     htmlDocument.LoadHtml(strResponse);
                     HtmlAgilityPack.HtmlNode titleNode = htmlDocument.DocumentNode.SelectSingleNode("//meta[@property='og:description']");

                     if (titleNode != null)
                     {
                         string desc = titleNode.GetAttributeValue("content", "");
                         imageCollection[i].ImageDescription = desc;
                     }
                 }
                 catch (Exception ex)
                 {
                     throw ex;
                 }

             }), httpReq);

            httpReq.Abort();

Respuesta aceptada

Obtuve la respuesta de otra publicación en desbordamiento de pila modificada para adaptar mi solución aquí Obtención de la respuesta de un HttpWebRequest asíncrono

Hice una clase específica llamada Solicitud para transformar mi lógica a una nueva asíncrona y espero aquí es

       public Task<string> MakeAsyncRequest()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);

            Task<WebResponse> task = Task.Factory.FromAsync(
                request.BeginGetResponse,
                asyncResult => request.EndGetResponse(asyncResult),
                (object)null);

            return task.ContinueWith(t => ReadStreamFromResponse(t.Result));
        }

        private string ReadStreamFromResponse(WebResponse response)
        {
            string desc = "";
            try
            {
           using (Stream responseStream = response.GetResponseStream())
                using (StreamReader sr = new StreamReader(responseStream))
                {
                    //Need to return this response 
                    string strContent = sr.ReadToEnd();
                    HtmlDocument htmlDocument = new HtmlDocument();
                    htmlDocument.OptionFixNestedTags = true;
                    htmlDocument.LoadHtml(strContent);
                    HtmlAgilityPack.HtmlNode titleNode = htmlDocument.DocumentNode.SelectSingleNode("//meta[@property='og:description']");

                    if (titleNode != null)
                    {
                        desc = titleNode.GetAttributeValue("content", "");

                    }
                    imageDesc = desc;
                    return desc;
                }
            }
            catch (Exception ex)
            { return desc; }
        }

        public string imageDesc { get; private set; }

    }

Entonces hice una cola de solicitud

        queueWebRequest = new Queue<Request>();

        for (int i = 0; i < imageCollection.Count; i++)
        {
            queueWebRequest.Enqueue(new Request(imageCollection[i].ImageTag));

        }

        for (int i = 0; i < imageCollection.Count; i++)
        {
            if (queueWebRequest.Count > 0)
            {
                Request currentRequest = queueWebRequest.Dequeue();
                await currentRequest.MakeAsyncRequest();
                imageCollection[i].ImageDescription = currentRequest.imageDesc;

            }
            else
                break;
        }


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow