HttpClient请求数据报AggregateException异常

FainSheeg 2018-01-30 12:16:56
之前写了一个用HttpClient模拟请求,获取网站数据的程序。之前用得好好的,最近偶尔会报:AggregateException:“发生一个或多个错误。”。我是用一个Timer,10秒获取一次数据,异常只是偶然性的,有时候挂上半天时间才能出一次。想请教是什么原因,或者怎样去获取具体是什么异常?。代码如下:
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连接池满了,所以改成长连接,还是一样会出异常。
...全文
1111 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
FainSheeg 2018-02-12
  • 打赏
  • 举报
回复
引用 8 楼 From_TaiWan 的回复:
哦,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竟然没给我准备同步请示的方法。
FainSheeg 2018-02-12
  • 打赏
  • 举报
回复
引用 9 楼 sp1234 的回复:
创建异步子线程,然后又阻塞死等这个线程结束,这中代码是不是荒唐透顶啦?你把这种东西写成正常的同步执行代码,再来调试、测试吧。

我也觉得挺荒唐的。可是架不住我只能找到异步的请求方法,没看到同步的方法难道我找错地方了?
  • 打赏
  • 举报
回复
创建异步子线程,然后又阻塞死等这个线程结束,这中代码是不是荒唐透顶啦?你把这种东西写成正常的同步执行代码,再来调试、测试吧。
秋的红果实 2018-02-11
  • 打赏
  • 举报
回复
哦,4.0不支持,这个我还不知道 那也不要另加一个timer,情况可能更加糟糕 我是用一个Timer,10秒获取一次数据,异常只是偶然性的 ==> 不知道你用的是哪种timer? 可以尝试System.Threading.Timer ,请参考https://jingyan.baidu.com/article/8ebacdf024593049f65cd5cd.html 业务处理,不要使用task,用Thread,10秒内若没有完成(判断IsAlive属性),直接Abort();启动新的线程,新线程执行业务处理 Abort()要知道有风险,要在之前做好准备
FainSheeg 2018-02-11
  • 打赏
  • 举报
回复
引用 4 楼 From_TaiWan 的回复:
若是因为超时引起,给你解决方法:使用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
异常依旧
FainSheeg 2018-02-11
  • 打赏
  • 举报
回复
引用 2 楼 starfd 的回复:
try catch,然后递归取InnerException
一级exception的innerexception就已经是null了
luckljtchinaren 2018-02-01
  • 打赏
  • 举报
回复
超时。 考虑一下目标站点是否存在高并发处理不过来,还有网络是否一致稳定。
秋的红果实 2018-02-01
  • 打赏
  • 举报
回复
若是因为超时引起,给你解决方法:使用CancellationTokenSource类,例如var cancelTokenSource = new CancellationTokenSource(10000);将cancelTokenSource对象传给task对象,表示10秒后,若没有执行完任务,就自动取消 VB我只懂皮毛,lz自己探索具体做法。底层类库和C#一样
秋的红果实 2018-02-01
  • 打赏
  • 举报
回复
将每隔10秒改成20秒或者更长,看会不会出现问题了。 我感觉是10秒内没执行完task任务,新的请求又开始了 获取异常,

try
{

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

  • 打赏
  • 举报
回复
try catch,然后递归取InnerException
FainSheeg 2018-02-01
  • 打赏
  • 举报
回复
没人理啊

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧