Ich muss Web-Service mehrere Male aufrufen (in Schleife) Das Problem ist, dass mein Code immer leeres Objekt (Image Description) zurückgibt und nicht ordnungsgemäß ausgeführt wird, wenn ich es separat getestet habe (out of loop) hat es normal funktioniert
Hier ist mein Teil des Codes
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();
Ich habe die Antwort von einem anderen Post in Stack-Überlauf geändert, um meine Lösung hier anzupassen, die Antwort eines asynchronen HttpWebRequest zu erhalten
Ich habe eine bestimmte Klasse mit dem Namen Request erstellt, um meine Logik in Async zu transformieren und hier zu warten
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; }
}
Dann machte ich eine Warteschlange der Anfrage
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;
}