C# 异步HttpWebRequest捕获WebException

C# 异步HttpWebRequest捕获WebException,c#,asynchronous,httpwebrequest,httpwebresponse,C#,Asynchronous,Httpwebrequest,Httpwebresponse,我试图从异步HttpWebRequest捕获WebException,以从api读取soap:fault。但它抛出了聚合异常。是否有方法捕获异步HttpWebRequest的WebException public async Task<XDocument> GetXmlSoapResponseAsync(string soapRequestURL, string xmlData) { try { //create xml doc

我试图从异步
HttpWebRequest
捕获
WebException
,以从api读取soap:fault。但它抛出了聚合异常。是否有方法捕获异步
HttpWebRequest
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;
      }

    }
public异步任务GetXmlSoapResponseAsync(字符串soapRequestURL,字符串xmlData)
{
尝试
{
//创建xml文档
XmlDocument doc=新的XmlDocument();
//从xmlData加载xml文档
doc.LoadXml(xmlData);
//creta web请求
HttpWebRequest req=(HttpWebRequest)WebRequest.Create(soapRequestURL);
req.ContentType=“text/xml”;
req.Accept=“text/xml”;
请求方法=“POST”;
//从req获取请求流
Stream stm=req.GetRequestStream();
文件保存(stm);
stm.Close();
Task Task=Task.Factory.fromsync(
请求开始响应,
asyncResult=>req.EndGetResponse(asyncResult),
(对象为空);
var response=task.Result;
return wait task.ContinueWith(t=>ReadStreamFromResponse(response,stm,soapRequestURL,xmlData));
}
捕获(WebException WebException)
{
LogWebException(webException、soapRequestURL、xmlData);
返回null;
}
}
更改此选项

var response = task.Result;
对此

var response = await task;
wait
返回任务的结果或打开
聚合异常
(如果有)


另外,
.Result
会在结果可用之前阻塞当前线程,这可能不是您想要的,否则您只需使用阻塞
GetResponse
,而不是异步
BeginGetResponse
EndGetResponse

而且,你甚至不需要这两种方法。还有一个更好的-
GetResponseAsync

使用以下命令:

var response = await req.GetResponseAsync();
与此相反:

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

var response = task.Result;
Task Task=Task.Factory.fromsync(
请求开始响应,
asyncResult=>req.EndGetResponse(asyncResult),
(对象为空);
var response=task.Result;
更改此选项

var response = task.Result;
对此

var response = await task;
wait
返回任务的结果或打开
聚合异常
(如果有)


另外,
.Result
会在结果可用之前阻塞当前线程,这可能不是您想要的,否则您只需使用阻塞
GetResponse
,而不是异步
BeginGetResponse
EndGetResponse

而且,你甚至不需要这两种方法。还有一个更好的-
GetResponseAsync

使用以下命令:

var response = await req.GetResponseAsync();
与此相反:

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

var response = task.Result;
Task Task=Task.Factory.fromsync(
请求开始响应,
asyncResult=>req.EndGetResponse(asyncResult),
(对象为空);
var response=task.Result;
更改此选项

var response = task.Result;
对此

var response = await task;
wait
返回任务的结果或打开
聚合异常
(如果有)


另外,
.Result
会在结果可用之前阻塞当前线程,这可能不是您想要的,否则您只需使用阻塞
GetResponse
,而不是异步
BeginGetResponse
EndGetResponse

而且,你甚至不需要这两种方法。还有一个更好的-
GetResponseAsync

使用以下命令:

var response = await req.GetResponseAsync();
与此相反:

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

var response = task.Result;
Task Task=Task.Factory.fromsync(
请求开始响应,
asyncResult=>req.EndGetResponse(asyncResult),
(对象为空);
var response=task.Result;
更改此选项

var response = task.Result;
对此

var response = await task;
wait
返回任务的结果或打开
聚合异常
(如果有)


另外,
.Result
会在结果可用之前阻塞当前线程,这可能不是您想要的,否则您只需使用阻塞
GetResponse
,而不是异步
BeginGetResponse
EndGetResponse

而且,你甚至不需要这两种方法。还有一个更好的-
GetResponseAsync

使用以下命令:

var response = await req.GetResponseAsync();
与此相反:

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

var response = task.Result;
Task Task=Task.Factory.fromsync(
请求开始响应,
asyncResult=>req.EndGetResponse(asyncResult),
(对象为空);
var response=task.Result;


感谢您使用wait-req.GetResponseAsync();,快速、完美地回答并优化了我的代码;。我对这个异步的东西还不熟悉,我必须多读一些书才能正确地理解它。非常感谢你@桑吉耶夫:没问题。
BeginXX
EndXX
这对方法是的一部分,它们在.NET4.5之前非常有用。如今,随着async/await的引入,在大多数情况下,您最好使用与之对应的
XXAsync
。@sanjeev同样,如果您需要使用具有
Begin
/
End
方法对的API,但是没有
XXAsync
方法-那么您应该使用
Task.Factory.fromsync
创建任务并等待它,就像您刚才所做的一样;)这是旧API的一个变通方法。很高兴了解这个变通方法。我不知道。谢谢。waitwait在VS 2010中不可用。感谢您使用wait-req.GetResponseAsync();,快速给出完美答案并优化我的代码;。我对这个异步的东西还不熟悉,我必须多读一些书才能正确地理解它。非常感谢你@桑吉耶夫:没问题。
BeginXX
EndXX
这对方法是的一部分,它们在.NET4.5之前非常有用。如今,随着async/await的引入,在大多数情况下,您最好使用与之对应的
XXAsync
。@sanjeev同样,如果您需要使用具有
Begin
/
End
方法对的API,但是没有
XXAsync
方法-那么您应该使用
Task.Factory.fromsync
创建任务并等待它,就像您刚才所做的一样;)这是旧API的一个变通方法。啊,grea