2014-03-01 3 views
0

비동기 HttpWebRequest에서 WebException을 캐치하여 apap에서 비누를 읽으려고합니다. 그러나 그것은 AggregateException을 던졌습니다. 비동기 HttpWebRequestWebException을 붙잡는 방법이 있습니까? 어떤 경우비동기 HttpWebRequest catch WebException

public async Task<XDocument> GetXmlSoapResponseAsync(string soapRequestURL, string xmlData) 
    { 
     try 
     { 
     //create xml doc 
     XmlDocument doc = new XmlDocument(); 

     //load xml document frtom xmlData 
     doc.LoadXml(xmlData); 
     //creta web request 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(soapRequestURL); 
     req.ContentType = "text/xml"; 
     req.Accept = "text/xml"; 
     req.Method = "POST"; 

     //GetRequestStream from req 
     Stream stm = req.GetRequestStream(); 
     doc.Save(stm); 
     stm.Close(); 

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

     var response = task.Result; 
     return await task.ContinueWith(t => ReadStreamFromResponse(response,stm, soapRequestURL,xmlData)); 
     } 
     catch (WebException webException) 
     { 
     LogWebException(webException, soapRequestURL, xmlData); 

     return null; 
     } 

    } 

답변

3

는 변경이

var response = await task; 

await 반환이

var response = task.Result; 

는 작업 또는의 결과는 AggregateException을 펼쳤다.


또한, 결과까지 .Result 블록, 현재의 thread를 사용할 수 있습니다, 그것은 그렇지 않으면 당신은 단지 대신 비동기 BeginGetResponseEndGetResponse의, 차단 GetResponse를 사용하는 것, 당신이 원하는 아마 아니다.

도 두 가지 방법이 필요하지 않습니다. 거기에 더 나은 하나 - GetResponseAsync

사용이 대신이의

var response = await req.GetResponseAsync(); 

: 빠르고 완벽한 답변

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

var response = task.Result; 
+0

감사와 내 코드를 최적화는() req.GetResponseAsync을 기다리고 ;. 나는이 비동기식 것에 익숙하지 않고 그것을 제대로 이해하기 위해서는 더 많이 읽어야한다. 정말 고맙습니다! – sanjeev

+1

@sanjeev 문제 없습니다. 'BeginXX'와'EndXX' 메소드의 쌍은 [APM - 비동기 프로그래밍 모델] (http://msdn.microsoft.com/en-us/library/ms228963(v=vs.110).aspx)의 일부입니다.) .NET 4.5 이전에는 정말 유용했습니다. 요즘에는 async/await가 도입되어 대부분의 상황에서'XXAsync'를 사용하는 것이 좋습니다. – dcastro

+0

감사합니다. dcastro! – sanjeev