여러 HttpWebRequest 루프?

.net c# html-agility-pack httpwebrequest

문제

웹 서비스를 여러 번 호출해야하는데 (루프 내에서) 문제는 내 코드가 항상 빈 객체 (이미지 설명)를 반환하고 정상적으로 작동했을 때 (루프 밖으로) 개별적으로 테스트했을 때 올바르게 실행되지 않는다는 것입니다.

여기 내 코드 부분이있다.

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();

수락 된 답변

스택 오버플로의 다른 게시물에서 답변을 얻었으므로 여기에서 내 솔루션을 수정했습니다 . 비동기식 HttpWebRequest 응답 받기

내 논리를 새로운 비동기식으로 변환하기 위해 Request라는 특정 클래스를 만들었으며 여기서 기다리고 있습니다.

       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; }

    }

그런 다음 요청 대기열을 만들었습니다.

       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; }

    }



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.