HttpClient请求数据报AggregateException异常

时间:2021-06-17 02:16:07
之前写了一个用HttpClient模拟请求,获取网站数据的程序。之前用得好好的,最近偶尔会报:AggregateException:“发生一个或多个错误。”。我是用一个Timer,10秒获取一次数据,异常只是偶然性的,有时候挂上半天时间才能出一次。想请教是什么原因,或者怎样去获取具体是什么异常? HttpClient请求数据报AggregateException异常。代码如下:
Public Class HTTPHelper
    Shared client As New HttpClient
    Public Function PostMethod(url As String, values As List(Of KeyValuePair(Of String, String))) As HttpResponseMessage
        Dim content = New FormUrlEncodedContent(values)
        Dim posttask As Threading.Tasks.Task(Of HttpResponseMessage) = client.PostAsync(url, content)
        posttask.Wait()
        Dim response As HttpResponseMessage = posttask.Result
        Return response
    End Function

    Public Function GetMethod(url As String) As String
        Dim gettask As Threading.Tasks.Task(Of HttpResponseMessage) = client.GetAsync(url)
        gettask.Wait()
        Dim response As HttpResponseMessage = gettask.Result
        response.EnsureSuccessStatusCode()
        Dim readtask = response.Content.ReadAsStringAsync
        readtask.Wait()
        Return readtask.Result
    End Function

    Public Sub New()
        client.DefaultRequestHeaders.Connection.Add("keep-alive")
    End Sub
End Class
这是自己写的一个简单的辅助类。
Private Function getJsonObject(username As String, pwd As String) As JObject
        Dim httphelper As New DAL.HTTPHelper
        Dim values As New List(Of KeyValuePair(Of String, String)) From {
            New KeyValuePair(Of String, String)("username", username),
            New KeyValuePair(Of String, String)("password", pwd),
            New KeyValuePair(Of String, String)("channel_type", "61")
        }
        Dim response = httphelper.PostMethod("http://web.yunyichina.cn/api/yyt.base.user.sys.login", values)
        Dim getstr As String
        getstr = "http://web.yunyichina.cn/api/yyt.clinic.fuyin.untreated.apply.list?hospital_code=gzzyydxdyfsyy&page_size=10&page_num=1&order_no=&agt_order_num=&pat_name=&admission_no=&begin_time=" & DateAdd(DateInterval.Month, -1, Now).ToString("yyyy-MM-dd") & "2017-11-29 00:00&end_time=" & Now.ToString("yyyy-MM-dd") & " 23:59&apply_status="
        Dim responsestring As String = httphelper.GetMethod(getstr)

        Dim jsonob As JObject = JObject.Parse(responsestring)
        Return jsonob
    End Function
这是业务逻辑,调用 的时候给出参数得到JObject,再进入其他逻辑。
网上有说是服务TCP连接池满了,所以改成长连接,还是一样会出异常。

11 个解决方案

#1


没人理啊 HttpClient请求数据报AggregateException异常

#2


try catch,然后递归取InnerException

#3


将每隔10秒改成20秒或者更长,看会不会出现问题了。
我感觉是10秒内没执行完task任务,新的请求又开始了

获取异常,

try
{

}
catch(e1 As Exception)
{
    e1.Message '就是异常信息
}



#4


若是因为超时引起,给你解决方法:使用CancellationTokenSource类,例如var cancelTokenSource = new CancellationTokenSource(10000);将cancelTokenSource对象传给task对象,表示10秒后,若没有执行完任务,就自动取消
VB我只懂皮毛,lz自己探索具体做法。底层类库和C#一样

#5


超时。
考虑一下目标站点是否存在高并发处理不过来,还有网络是否一致稳定。

#6


引用 2 楼 starfd 的回复:
try catch,然后递归取InnerException

一级exception的innerexception就已经是null了 HttpClient请求数据报AggregateException异常

#7


引用 4 楼 From_* 的回复:
若是因为超时引起,给你解决方法:使用CancellationTokenSource类,例如var cancelTokenSource = new CancellationTokenSource(10000);将cancelTokenSource对象传给task对象,表示10秒后,若没有执行完任务,就自动取消
VB我只懂皮毛,lz自己探索具体做法。底层类库和C#一样

用的4.0框架没办法直接 new CancellationTokenSource(10000),加了一个timer手动触发。
 Public Shared Function GetMethod(url As String) As String
        Dim ctoken As New CancellationTokenSource
        Dim timer As New Timers.Timer(9000) With {.AutoReset = False}
        AddHandler timer.Elapsed, AddressOf ctoken.Cancel
        timer.Start()
        Dim gettask As Task(Of HttpResponseMessage) = client.GetAsync(url, ctoken.Token)
        gettask.Wait()
        Dim response As HttpResponseMessage = gettask.Result
        response.EnsureSuccessStatusCode()
        Dim readtask = response.Content.ReadAsStringAsync
        readtask.Wait()
        Return readtask.Result
    End Function

异常依旧 HttpClient请求数据报AggregateException异常

#8


哦,4.0不支持,这个我还不知道
那也不要另加一个timer,情况可能更加糟糕

我是用一个Timer,10秒获取一次数据,异常只是偶然性的
==>
不知道你用的是哪种timer?
可以尝试System.Threading.Timer ,请参考 https://jingyan.baidu.com/article/8ebacdf024593049f65cd5cd.html
业务处理,不要使用task,用Thread,10秒内若没有完成(判断IsAlive属性),直接Abort();启动新的线程,新线程执行业务处理
Abort()要知道有风险,要在之前做好准备





#9


创建异步子线程,然后又阻塞死等这个线程结束,这中代码是不是荒唐透顶啦?你把这种东西写成正常的同步执行代码,再来调试、测试吧。

#10


引用 9 楼 sp1234 的回复:
创建异步子线程,然后又阻塞死等这个线程结束,这中代码是不是荒唐透顶啦?你把这种东西写成正常的同步执行代码,再来调试、测试吧。

我也觉得挺荒唐的。可是架不住我只能找到异步的请求方法,没看到同步的方法 HttpClient请求数据报AggregateException异常难道我找错地方了? HttpClient请求数据报AggregateException异常

#11


引用 8 楼 From_* 的回复:
哦,4.0不支持,这个我还不知道
那也不要另加一个timer,情况可能更加糟糕

我是用一个Timer,10秒获取一次数据,异常只是偶然性的
==>
不知道你用的是哪种timer?
可以尝试System.Threading.Timer ,请参考 https://jingyan.baidu.com/article/8ebacdf024593049f65cd5cd.html
业务处理,不要使用task,用Thread,10秒内若没有完成(判断IsAlive属性),直接Abort();启动新的线程,新线程执行业务处理
Abort()要知道有风险,要在之前做好准备

我是真不想用task,thread也不想用,我就不想异步 的,httpclient竟然没给我准备同步请示的方法。 HttpClient请求数据报AggregateException异常

#1


没人理啊 HttpClient请求数据报AggregateException异常

#2


try catch,然后递归取InnerException

#3


将每隔10秒改成20秒或者更长,看会不会出现问题了。
我感觉是10秒内没执行完task任务,新的请求又开始了

获取异常,

try
{

}
catch(e1 As Exception)
{
    e1.Message '就是异常信息
}



#4


若是因为超时引起,给你解决方法:使用CancellationTokenSource类,例如var cancelTokenSource = new CancellationTokenSource(10000);将cancelTokenSource对象传给task对象,表示10秒后,若没有执行完任务,就自动取消
VB我只懂皮毛,lz自己探索具体做法。底层类库和C#一样

#5


超时。
考虑一下目标站点是否存在高并发处理不过来,还有网络是否一致稳定。

#6


引用 2 楼 starfd 的回复:
try catch,然后递归取InnerException

一级exception的innerexception就已经是null了 HttpClient请求数据报AggregateException异常

#7


引用 4 楼 From_* 的回复:
若是因为超时引起,给你解决方法:使用CancellationTokenSource类,例如var cancelTokenSource = new CancellationTokenSource(10000);将cancelTokenSource对象传给task对象,表示10秒后,若没有执行完任务,就自动取消
VB我只懂皮毛,lz自己探索具体做法。底层类库和C#一样

用的4.0框架没办法直接 new CancellationTokenSource(10000),加了一个timer手动触发。
 Public Shared Function GetMethod(url As String) As String
        Dim ctoken As New CancellationTokenSource
        Dim timer As New Timers.Timer(9000) With {.AutoReset = False}
        AddHandler timer.Elapsed, AddressOf ctoken.Cancel
        timer.Start()
        Dim gettask As Task(Of HttpResponseMessage) = client.GetAsync(url, ctoken.Token)
        gettask.Wait()
        Dim response As HttpResponseMessage = gettask.Result
        response.EnsureSuccessStatusCode()
        Dim readtask = response.Content.ReadAsStringAsync
        readtask.Wait()
        Return readtask.Result
    End Function

异常依旧 HttpClient请求数据报AggregateException异常

#8


哦,4.0不支持,这个我还不知道
那也不要另加一个timer,情况可能更加糟糕

我是用一个Timer,10秒获取一次数据,异常只是偶然性的
==>
不知道你用的是哪种timer?
可以尝试System.Threading.Timer ,请参考 https://jingyan.baidu.com/article/8ebacdf024593049f65cd5cd.html
业务处理,不要使用task,用Thread,10秒内若没有完成(判断IsAlive属性),直接Abort();启动新的线程,新线程执行业务处理
Abort()要知道有风险,要在之前做好准备





#9


创建异步子线程,然后又阻塞死等这个线程结束,这中代码是不是荒唐透顶啦?你把这种东西写成正常的同步执行代码,再来调试、测试吧。

#10


引用 9 楼 sp1234 的回复:
创建异步子线程,然后又阻塞死等这个线程结束,这中代码是不是荒唐透顶啦?你把这种东西写成正常的同步执行代码,再来调试、测试吧。

我也觉得挺荒唐的。可是架不住我只能找到异步的请求方法,没看到同步的方法 HttpClient请求数据报AggregateException异常难道我找错地方了? HttpClient请求数据报AggregateException异常

#11


引用 8 楼 From_* 的回复:
哦,4.0不支持,这个我还不知道
那也不要另加一个timer,情况可能更加糟糕

我是用一个Timer,10秒获取一次数据,异常只是偶然性的
==>
不知道你用的是哪种timer?
可以尝试System.Threading.Timer ,请参考 https://jingyan.baidu.com/article/8ebacdf024593049f65cd5cd.html
业务处理,不要使用task,用Thread,10秒内若没有完成(判断IsAlive属性),直接Abort();启动新的线程,新线程执行业务处理
Abort()要知道有风险,要在之前做好准备

我是真不想用task,thread也不想用,我就不想异步 的,httpclient竟然没给我准备同步请示的方法。 HttpClient请求数据报AggregateException异常