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