什么';在C#中处理异步HttpWebRequest异常的最佳方法是什么?

什么';在C#中处理异步HttpWebRequest异常的最佳方法是什么?,c#,.net,asynchronous,httpwebrequest,C#,.net,Asynchronous,Httpwebrequest,我正在编写一些代码来异步使用HttpWebRequest。如果您中的任何人以前做过这件事,那么您知道错误处理可能会有点麻烦,因为如果在某个回调方法中抛出异常,则无法通过try/catch块将其传递回调用代码 我想做的是通过在传递给每个回调方法的状态对象中保存异常来处理错误。如果捕获到异常,状态对象将被更新,然后http调用将中止。我的问题是,在我的状态对象中,我必须使用Exception属性,以便存储任何类型的异常。当调用代码检查state对象并“看到”异常时,它不知道异常的类型 有没有一种方法

我正在编写一些代码来异步使用HttpWebRequest。如果您中的任何人以前做过这件事,那么您知道错误处理可能会有点麻烦,因为如果在某个回调方法中抛出异常,则无法通过try/catch块将其传递回调用代码

我想做的是通过在传递给每个回调方法的状态对象中保存异常来处理错误。如果捕获到异常,状态对象将被更新,然后http调用将中止。我的问题是,在我的状态对象中,我必须使用Exception属性,以便存储任何类型的异常。当调用代码检查state对象并“看到”异常时,它不知道异常的类型

有没有一种方法允许我的状态对象保存任何类型的异常,但仍然保持异常的强类型

状态对象

public class HttpPostClientAsyncModel
    {
        public HttpResponseSnapshot Response { get; set; }
        public HttpPostClientAsyncStatus Status { get; set; }
        public Exception Exception { get; set; }
        public WebRequest Request { get; set; }
    }

异常对象仍然是强类型的,并保留其原始字段值。您只需按如下方式进行检查:

if (asyncModel.Exception is ArgumentException)
{
  // Handle argument exception here
  string invalidParameter = (asyncModel.Exception as ArgumentException).ParamName;
}
else if (...)
{
}
无论如何,您通常会使用try/catch块执行非常类似的检查,因此这应该不会带来不便。如果您真的担心这个问题,只需使用sync方法创建一个新线程,并使用continuation选项处理异常:

Task.Factory.StartNew(() => { DoWork(); })
.ContinueWith(t => Logger.Error("An exception occurred while processing. Check the inner exception for details", t.Exception),
TaskContinuationOptions.OnlyOnFaulted);

调用代码可以在try块中抛出model.Exception,然后安装程序捕获调用方可以适当处理的特定异常子类型。或许不是……:)这是否仅用于学习体验?HttpWebRequest.BeginGetResponse有什么问题?